1

以下はコードで、いくつか理解したいことがあります。

public class Test {
    public void dosomething( ) {
      Derived2 d2 = new Derived2 () ;
      Base bobject = d2;
      string str = "str" ;
      bobject.Method1( str ); // I want to call Method1 of Derived1 class
    }
  }

  public class Derived2 : Derived1 {
    public void Method1( string s ) {

    }
  }

  public class Derived1 : Base {
    public override void Method1( double d ) {

    }

    public override void Method2( double d ) {

    }
  }

  public abstract class Base {
    public abstract void Method1( double d );
    public abstract void Method2( double d );
  }

派生クラスオブジェクトを基本抽象クラスオブジェクトに割り当てると正確に何が起こるか知りたいです。抽象クラスをインスタンス化できないことはわかっています。私の場合、クラスDerived1を派生させ、 Derived2クラスのオブジェクトを基本抽象クラス オブジェクト に割り当てています。ここで、文字列引数を受け入れるDervied2クラス メソッドMethod1にアクセスしたいと思います。どういうわけか、このメソッドにアクセスできません。基本抽象クラスから派生した複数のクラスが存在します。私は物事を一般的に保ちたいと思っています。

4

3 に答える 3

1

派生クラスオブジェクトを基本抽象クラスオブジェクトに代入すると正確に何が起こるか

コードにはオブジェクトの割り当てはなく、変数の割り当てがあります。代入後、変数bobjectは同じオブジェクトを参照しd2ます。オブジェクト型 (およびオブジェクト状態のすべて) は変更されません。

ここで、文字列引数を受け入れる Dervied2 クラス メソッド Method1 にアクセスしたいと思います

bobjectにキャストしないと、サンプルでこれを行うことはできませんDerived2:

((Derived2)bobject).Method1(str)

一般的なものを維持したい

次に、基本クラスの一部ではないメンバーにアクセスしようとしないでください。

于 2013-09-24T10:01:01.557 に答える
0

bobjectは、文字列ではなく double を受け入れる 2 つのメソッドを持つ の型ですBase(そのメソッドはDerived2の実装で定義されています)。

bobject必要なことを行うには、次のように Derived2にキャストする必要があります。

var d3 = bobject as Derived2;
d3.Method1("String");
于 2013-09-24T10:05:48.437 に答える
0

あなたもできる

(bobject as Derived2).Method1(文字列);

これは、解決が変数の型に基づいているためです。

于 2013-09-24T10:36:04.283 に答える