-1

派生クラスにキャストした後、派生クラスのメソッドを使用するにはどうすればよいですか。

public class BaseClass
{
  public virtual void DoSomething()
  {
    Trace.Write("base class");
   }
}

public class DerivedClass : BaseClass
{
  public override void DoSomethingElse()
  {
    Trace.Write("derived class");
  }
}

電話できるようになりたい

BaseClass B ( (BaseClass*) new DerivedClass());
B.DoSomethingElse();

さまざまな理由で B を BaseClass としてキャストする必要があります... C という派生クラスのインスタンスを取得し、それを BaseClass としてキャストして、同じインスタンスへの 2 つの異なる参照を作成できますか?

4

1 に答える 1

2

C# を使用しているように見えますが、考え方は同じです。目的のメソッドが存在する型にオブジェクトをキャストする必要があります。考慮してください (以下は C++ です)。

BaseClass* b = new DerivedClass( );
b->DoSomethingElse( ); // fails because this method doesn't exist for BaseClass
((DerivedClass*)b)->DoSomethingElse( ); // works because it's cast to the correct type

C# の例:

BaseClass b = new DerivedClass( );
b.DoSomethingElse( ); // fails because this method doesn't exist for BaseClass
(b as DerivedClass).DoSomethingElse( ); // works because it's cast to the correct type

詳細については、別の型としてキャストし、別のローカル変数に割り当てて、同じインスタンスを 2 つの異なる型として表示することができます。したがって、オブジェクトへの (BaseClass 型の) ポインターと、オブジェクトへの (DerivedClass 型の) 別のポインターを持つことができます。それは完全に有効です。検討:

C++:

BaseClass* b;
DerivedClass* c;
b = c = new DerivedClass( );
c->DoSomethingElse( ); // totally works

C#:

BaseClass b;
DerivedClass c;
b = c = new DerivedClass( );
c.DoSomethingElse( ); // totally works

[編集]: C++/CLI を使用している場合は、アスタリスク (*) をハット (^) に置き換えてください。

于 2013-10-03T15:56:14.167 に答える