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

本文关键字:一个 实例化 有条件 | 更新日期: 2023-09-27 18:02:03

我一直在竭尽全力想让一个新代码工作。通过if语句,我已经能够以一种更简单但更广泛的方式做到这一点。然而,由于这将是应用程序的第2版,我希望代码更干净,更高效。

我想做的是有条件地实例化一个类。它会像这样:

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

我有两个类,但我想使用关键字"飞机",这样我就不必为每个类创建多个部分的代码。我还发现多重继承(在我看来,这是可行的)在c#中是不可用的,而且我对这种语言相对来说还是个新手。

到目前为止,我已经完成了以我想要的方式实例化类,但是我似乎不能使用在每个类中声明的变量。我已经这样做了:
    int Airplane = 195;
    var Aircraft = Activator.CreateInstance( (Airplane == 195) ? typeof(_E195) : typeof(_E190));
    MessageBox.Show(Aircraft.GetType().ToString());

MessageBox正确地显示了类型,但是,我不能使用"Aircraft"对象访问类本身。我相信还有更多的方法可以做到这一点,但其中任何一种对我来说都很好。

谢谢!

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

我认为它们都是从别的东西继承的,这就是为什么你需要多重继承?

制作一个接口(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();

不能使用前面的方法访问类的原因是,编译器需要知道它是什么类型的类。要做到这一点,您需要将其强制转换为适当的类型…但这又让你回到了同样的问题。您可以使用反射方法来继续这样做,但是使用继承或实现会更有效和干净。

为什么不定义一些像

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();

编辑:另外,正如其他人建议的那样,您可以使用接口而不是抽象类。注意,在这种情况下,您必须双重定义所有公共属性和方法,如果有的话。

了解对象工厂模式