4

したがって、Accountから派生した、SavingsとCheckingで構成されるAccountタイプの配列があります。これらにメソッドを呼び出させることは可能ですか?コンパイラは基本クラスのメソッドのみを表示し、派生クラスのメソッドにアクセスできません。ここの壁に頭をぶつけて。

4

3 に答える 3

4

配列内の要素を派生クラスにキャストする必要があります。

((Checking)someArray[42]).Whatever();

インスタンスが実際にそのタイプでない場合、これは。をスローしInvalidCastExceptionます。

于 2012-09-11T23:50:55.177 に答える
2

キャストを使用することはできますが、配列要素の正確なタイプがわからないため、多数の例外が発生し、それらを処理するためのコードがかなり醜くなります。

次のようなものを使用できます。

Saving s = array[i] as Saving;
if(s != null)
{
   s.SomeSavingMethod();
}
else
{
   Checking c = array[i] as Checking;
   if(c != null)
      c.SomeCheckingMethod();
}

ただし、タイプを推測し、それに応じてメソッドを呼び出すことは、通常、悪い設計と見なされます。これは仮想メソッドの場合のように聞こえます。または、そもそもこれらのものを同じ配列に含めるべきではありません。

于 2012-09-12T00:03:29.357 に答える
0

探しているように見える機能を実現するには、基本的に2つの方法があります。

(あなたが説明する状況にとって)最初で間違いなく最良の方法は、これらすべてのクラスが実装する共通のインターフェースを宣言することです。

public interface IWorker
{
    void DoWork();
}

public class A : IWorker
{
    public void DoWork()
    {
        // TODO: Implement this method
        throw new NotImplementedException();
    }
}

public class B : IWorker
{
    public void DoWork()
    {
        // TODO: Implement this method
        throw new NotImplementedException();
    }
}

2つ目は、タイプを検出し、それがサポートされている場合はメソッドを呼び出すことです。これらの線に沿って。これは、キャストが成功した場合にのみnull以外の値を返すため、 AS演算子が非常に便利な場所です。

List<object> workers = new List<object>() { new A(), new B() };
foreach (object itm in workers)
{
    ClassThatSupportsDoWork obj = itm as ClassThatSupportsDoWork;
    if (obj != null)
        obj.DoWork();
}
于 2012-09-12T00:05:45.610 に答える