0

オブジェクト指向のコーディングに少し問題があります。

これが私のコードです:

 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 は error: errorAn explicit conversion exist (are you missing cast ?)を返します。そのようにキャストしようとする SuperEngine e4 =(SuperEngine ) new BasicEngine();と、実行時エラーが発生します。

4

2 に答える 2

3

Q1: SuperEngine ですが、名前が

  1. フィールド
  2. および仮想ではありません (フィールドは仮想化できません)

ただし、((SuperEngine)e3).name を呼び出すと、「ここにスーパー エンジンの名前」が表示されます。

Q2: 実際の例で説明すると、すべてのトラックは車ですが、すべての車がトラックというわけではありません。また、任意の車がトラックであると仮定すると、'dump()' または 'haus()' を実行しようとすると、すべての車がトラックのギアで初期化されているわけではないため、失敗します。

于 2012-05-10T23:56:36.463 に答える
3

Q1: がe3type として宣言されているためですBasicEngine。からSuperEngine継承しBasicEnginee3IS aであるため、コンストラクターBasicEngineを実行します。BasicEngine

Q2: 構文が間違っています。を行う必要がありますがSuperEngine e4 = new BasicEngine();、それでもエラーがスローされます。これは、BasicEngineコンストラクターが を作成する方法がわからないため、作成できSuperEngineないためです。親クラスは派生した子を認識していませんが、派生した子は親を認識しています。

于 2012-05-10T23:28:28.680 に答える