我一直在试图让新代码工作。我已经能够通过if语句以更简单但更广泛的方式完成此操作。但是,由于这将是应用程序的第2版,我希望使代码更清洁,更高效。
我想要做的是有条件地实例化一个类。它会是这样的:
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());
MessageBox正确显示了类型,但同样,我无法使用“Aircraft”对象访问类本身。我确信有更多的方法可以做到这一点,但其中任何一个对我都没问题。
谢谢!
答案 0 :(得分: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();
您无法使用以前的方法访问该类的原因是,为此,编译器需要知道它是什么类型的类。要做到这一点,你需要将它转换为适当的类型......但这会让你回到同样的问题。您可以使用反射方法继续使用它,但使用继承或实现它会更有效和干净。
答案 1 :(得分: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 :(得分:2)
阅读对象工厂模式