我在OO编码方面遇到了一些问题。
这是我的代码:
public class BasicEngine
{
public string name = null;
public string id = null;
public BasicEngine()
{
name = "Name of basic engine type";
id = "Basic engine id here";
}
}
public class SuperEngine: BasicEngine
{
public string name = null;
public string address = null;
public SuperEngine()
{
name = "Name of super engine here";
address = "Super engine address here";
}
}
我通过以下方式制作这些类的对象:
BasicEngine e1 = new BasicEngine();
MessageBox.Show("e1 type is " + e1.GetType().ToString());
SuperEngine e2 = new SuperEngine();
MessageBox.Show("e2 is " + e2.GetType().ToString());
BasicEngine e3 = new SuperEngine();
MessageBox.Show("e3 is " + e3.GetType().ToString());
SuperEngine e4 =BasicEngine(); // error An explicit conversion exist (are you missing cast ?) and if I try to cast it like SuperEngine e4 =(SuperEngine ) new BasicEngine(); it give run time error.
e1应该是BasicEngine。 e2应该是SuperEngine。
以下是我的困惑和疑问:
e3是BasicEngine类型,它显示了它的数据,我希望它是SuperEngine类型,为什么呢?
e4给出错误:错误An explicit conversion exist (are you missing cast ?)
如果我尝试像SuperEngine e4 =(SuperEngine ) new BasicEngine();
那样强制转换它会导致运行时错误。
答案 0 :(得分:3)
Q1:这是因为e3
被声明为BasicEngine
类型。由于SuperEngine
继承自BasicEngine
且e3
是BasicEngine
,因此它将运行BasicEngine
构造函数。
Q2:你的语法错了。你需要做SuperEngine e4 = new BasicEngine();
,但这仍然会引发错误。这是因为BasicEngine
构造函数不知道如何创建SuperEngine
,因此不会。家长班不知道他们的派生孩子,但派生的孩子知道他们的父母。
答案 1 :(得分:3)
Q1:它是一个SuperEngine,但是e3.name是“基本引擎类型的名称”,因为名称是
但如果你打电话给((SuperEngine)e3).name,你会看到“超级引擎名称”。
第二季度:用现实世界的例子解释:所有卡车都是汽车,但并非所有汽车都是卡车。如果你假装任何一辆汽车都是卡车 - 当你试图'倾倒()'或'拖运()'时你会失败,因为并非所有汽车都用卡车齿轮进行初始化。