ジェネリックスと新しいメンバーに問題があります。 ObjectA型のオブジェクトで動作するジェネリッククラスを作成しました。 ObjectBはObjectAから派生し、ObjectAのメンバーのいくつかを隠します。型パラメータとしてObjectBの型を汎用クラスに指定すると、ObjectBによって隠されたメンバのいずれかを呼び出すと、ObjectBの実装を呼び出すことになると思います。ただし、CLRは依然として非表示メンバー(ObjectAの実装)を呼び出します。これは、ObjectBの型をジェネリッククラスに明示的に提供したため、非論理的です。これはジェネリック医薬品自体の問題ですか、何か間違っていますか?ジェネリックス:非公開のメンバーではなく新メンバーへのアクセス
編集:残念ながら、私はObjectAのソースコードにアクセスできず、上書きしたいメンバは仮想ではありません。 ObjectAのソースコードにアクセスできれば、メンバーを仮想化できますが、できないので、メンバーを「上書きする」ための唯一の選択肢は「新しい」キーワードです。
class GenericClass<T> where T : ObjectA
{
public void DoWork(T item)
{
// When type parameter 'T' is ObjectB, should get ObjectB's implementation
item.Invoke();
}
}
class ObjectA
{
public void Invoke()
{
// A's implementation...
}
}
class ObjectB : ObjectA
{
public new void Invoke()
{
// B's implementation...
}
}
static void Main()
{
GenericClass<ObjectB> genericClass = new GenericClass<ObjectB>();
ObjectB objectB = new ObjectB();
genericClass.DoWork(objectB);
}
あなたの答えをありがとう。仮想/オーバーライドされたメソッドを使用しますが、System.Windows.Formを継承していて、仮想ではないメンバーのために独自の実装を作成しようとしています。 –
それで、あなたはこのようにアクセスすることはできません。あなたはそれを "ほぼ仮想"にしようとしているように思えます。それはそのようには機能しません。 –
Hm。あなたがC++テンプレートに慣れていれば、これはやや直感的ではないと私は同意します。 C#はテンプレートクラスのコンパイルを行い、そのときのObjectAについてのみ認識します。テンプレートがインスタンス化されると、インスタンス化されたクラスはObjectBの追加された知識で再コンパイルされません。 –