0

我在以 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。

以下是我的困惑和问题:

  1. e3 是 BasicEngine 类型,它显示了它的数据,我希望它是 SuperEngine 类型,为什么会这样?

  2. e4 给出错误:错误An explicit conversion exist (are you missing cast ?),如果我尝试像 SuperEngine e4 =(SuperEngine ) new BasicEngine();它一样投射它会给出运行时错误。

4

2 回答 2

3

Q1:这是因为e3被声明为 type BasicEngine。因为SuperEngine继承自BasicEnginee3IS a BasicEngine,所以它将运行BasicEngine构造函数。

Q2:您的语法是错误的。您需要这样做SuperEngine e4 = new BasicEngine();,但这仍然会引发错误。这是因为BasicEngine构造函数不知道如何创建 a SuperEngine,因此不会。父类不知道他们的派生孩子,但派生孩子知道他们的父母。

于 2012-05-10T23:28:28.680 回答
3

Q1:它是一个SuperEngine,但是e3.name是“基本引擎类型的名称”,因为name是

  1. 一个领域
  2. 并且不是虚拟的(并且字段不能是虚拟的)

但是如果你调用 ((SuperEngine)e3).name 你会看到“这里的超级引擎名称”。

Q2:用现实世界的例子来解释:所有的卡车都是汽车,但不是所有的汽车都是卡车。如果您假装任何汽车是卡车 - 当您尝试“转储()”或“运输()”时,您将失败,因为并非所有汽车都使用卡车齿轮进行初始化。

于 2012-05-10T23:56:36.463 回答