在C#中有条件地实例化一个类

3
我一直在努力让新代码运行起来。我已经通过if语句以更简单但更广泛的方式做到了这一点。然而,由于这将是应用程序的第二个版本,我希望让代码更加清晰和高效。
我想要做的是有条件地实例化一个类。它会像这样进行:
int Airplane = 195;

if (Airplane == 190)
    _E190 Aircraft = new _E190();

else if (Airplane == 195)
    _E195 Aircraft = new _E195();

我有两个类,但我想使用关键字"Aircraft",这样我就不必为每个类创建多个代码部分。我还发现在C#中不支持多重继承(在我看来这似乎可以解决问题),而且我对这种语言还相对陌生。

到目前为止,我成功按照自己的方式实例化了这个类,但我似乎无法使用声明在每个类内部的变量。我已经尝试了以下代码:

    int Airplane = 195;

    var Aircraft = Activator.CreateInstance( (Airplane == 195) ? typeof(_E195) : typeof(_E190));
    MessageBox.Show(Aircraft.GetType().ToString());

消息框正确显示了类型,但是我无法使用“飞机”对象访问类本身。我确信有更多的方法可以做到这一点,但是任何一种方法都对我来说都可以。

谢谢!

3个回答

12

我理解你的意思是它们都继承自其他东西,这就是为什么需要多重继承吗?

创建一个接口(IAircraft),让它们两个都实现它。

interface IAircraft {
    /* Common methods here */
}

class _E190 : TheParentClass, IAircraft {
    /* Your code */
}

class _E195 : TheOtherParentClass, IAircraft {
    /* Your code */
}

/* ... */

int Airplane = 195;
IAircraft Aircraft;

if (Airplane == 190)
    Aircraft = new _E190();
else if (Airplane == 195)
    Aircraft = new _E195();

你之前不能使用你的方法来访问该类的原因是,编译器需要知道它是哪种类型的类。而要做到这一点,你需要将其强制转换为适当的类型...但那会让你回到同样的问题。你可以使用反射方法来继续进行,但使用继承或实现更高效、更清晰。


2
+1,这是正确的。我认为OP的问题在于他想使用自动完成访问_E190/5特定字段,但这是不可能的。如果您能解释一下原因,那就太完美了。 - user703016

4
为什么不定义类似于以下内容:
public abstract class Aircraft
{
}

public class _E190 : Aircraft
{
}


public class _E195 : Aircraft
{
}

然后执行以下操作:
Aircraft Aircraft;
int Airplane = 195;

if (Airplane == 190)
    Aircraft = new _E190();

else if (Airplane == 195)
    Aircraft = new _E195();

编辑:另外,正如其他人所提出的那样,您可以使用接口而不是抽象类。请注意,在这种情况下,如果存在任何共同属性和方法,您将不得不双重定义它们。


2

了解一下对象工厂模式


工厂确实是一个完美的解决方案,但让那个人先理解继承 :) - Michael Sagalovich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接