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