OOP,为什么对象初始化不正确?

时间:2012-05-10 23:21:22

标签: c# .net

我在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();那样强制转换它会导致运行时错误。

2 个答案:

答案 0 :(得分:3)

Q1:这是因为e3被声明为BasicEngine类型。由于SuperEngine继承自BasicEnginee3BasicEngine,因此它将运行BasicEngine构造函数。

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

答案 1 :(得分:3)

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

  1. 一个字段
  2. 并且不是虚拟的(字段不能是虚拟的)
  3. 但如果你打电话给((SuperEngine)e3).name,你会看到“超级引擎名称”。

    第二季度:用现实世界的例子解释:所有卡车都是汽车,但并非所有汽车都是卡车。如果你假装任何一辆汽车都是卡车 - 当你试图'倾倒()'或'拖运()'时你会失败,因为并非所有汽车都用卡车齿轮进行初始化。