私はクラスの束を生成するライブラリを使用しています。ベースクラスオブジェクトでサブクラスメソッドを呼び出すにはどうすればよいですか?
これらのクラスはすべて共通の基本クラスから継承しますが、その基本クラスはすべてのサブクラスに共通のメソッドを定義していません。例えば
:
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
明らかにキャスティングは機能するが、どのタイプのものが利益を否定するかを知る必要がある。
これらのメソッドを呼び出すにはどうすればよいですか?私は呼び出したいメソッドを実装していないオブジェクトを取得する心配はありません。
CType(Obj, Object).Add(Item) // Note: I'm using C#--NOT VB
Againt、私は(私はルールアウト部分クラスを考えて)、これらのクラスを制御することはできません:私はインテリセンスを得ることはありませんが、コンパイラの幸せ、それが動作します - 私は実際にVBで私がやりたいことができます。
あなた自身の方法には何が問題なのですか? Option Strictを有効にしている場合にのみ私を使用してください –
サブクラスを管理できますか?もしそうなら、Luceroの解決策に進んでください。 –
@Michael Haren:C#にはOption Strictがまったくありません。私のソリューションは、クラスを制御できない場合に機能します.Lucceroのソリューションは、サブクラスを制御できる場合に最適です。 –