私は、一連のクラスを生成するライブラリを使用しています。
これらのクラスはすべて共通の基本クラスから継承されますが、その基本クラスはすべてのサブクラスに共通するいくつかのメソッドを定義していません。
例えば:
SubClassA : BaseClass{
void Add(ItemA item) {...}
ItemA CreateNewItem() {...}
}
SubClassB: BaseClass{
void Add(ItemB item) {...}
ItemB CreateNewItem() {...}
}
残念ながら、基本クラスにはこれらのメソッドがありません。これは素晴らしいでしょう:
BaseClass{
// these aren't actually here, I'm just showing what's missing:
abstract void Add(ItemBaseClass item); // not present!
abstract ItemBaseClass CreateNewItem(); // not present!
}
私の A+B オブジェクトには共通の基本クラスがあり、Item オブジェクトには共通の基本クラスがあるので、ポリモーフィズムの素晴らしい世界から恩恵を受けることを望んでいました。
残念ながら、一般的なメソッドは基本クラスに実際には存在しないため、仮想的に呼び出すことはできません。たとえば、これは完璧です:
BaseClass Obj;
Obj = GetWorkUnit(); // could be SubClassA or SubClassB
ItemBaseClass Item = Obj.CreateNewItem(); // Compile Fail: CreateNewItem() isn't in the base class
Item.DoSomething();
Obj.Add(Item); // Compile Fail: Add(...) isn't in the base class
明らかにキャストは機能しますが、その場合、メリットを無効にするタイプを知る必要があります。
これらのメソッドの呼び出しを「強制」するにはどうすればよいですか? 呼び出そうとしているメソッドを実装していないオブジェクトを取得する心配はありません。私は実際にVBでやりたいことをすることができます - 私はインテリセンスを得ることはできませんが、コンパイラは満足して動作します:
CType(Obj, Object).Add(Item) // Note: I'm using C#--NOT VB
繰り返しますが、私はこれらのクラスを制御することはできません (部分クラスを除外すると思います)。