1

<T>ClassNameを使用する抽象クラスのメソッド シグネチャをオーバーライドして、オブジェクトを再キャストせずに参照渡しできるようにする方法はありますか?

たとえば、オブジェクト マネージャーがたくさんあります。それらすべてに、オブジェクトの状態 (挿入、更新、削除など) に基づいて適切な保存アクションを実行する .Save(Object) メソッドを含める必要があります。

これらのメソッドを含む基本クラスを作成しようとしていました:

protected virtual bool Update<T>(ref T _object) where T : ObjectBase
{
    throw new NotImplementedException();
}

public virtual bool Save<T>(ref T _object) where T : ObjectBase
{ 
    // Figure out which action to take based on _object's state and execute it
}

そして、継承されたクラスが次のようなものを使用してメソッドを定義することを望みました:

public override bool Update<Consumer>(ref Consumer _object)
{
    return _service.UpdateConsumer(ref _object);
}

私の問題は、それが に<T>なること<Consumer>を指定でき<T>ないことです。

4

1 に答える 1

6

メソッド自体をジェネリックにする代わりに、基本クラス全体をジェネリックにする必要があります。

例えば:

public abstract class ObjectManager<T> where T : ObjectBase {
    protected abstract bool Update(T obj);
}

各具体的な ObjectManager はObjectManager、次のように、それが管理する型を継承する必要があります。

public class ConsumerManager : ObjectManager<Consumer> {
    protected override bool Update(Consumer obj) {
        ...
    }
}

ところで、パラメータはほぼ間違いなく渡されるべきではないことに注意してくださいref別のインスタンスを参照するように呼び出し元の変数を変更する場合
にのみ、refキーワードを指定する必要があります。 詳細については、こちらを参照してください。

于 2010-08-02T14:38:14.050 に答える