と呼ばれる多くの機能を含むクラスがありますRecord
。システムには、主キーが であるレコードと、主キーが であるレコードの 2 つの基本タイプが存在しuint
ますGuid
。
このRecord
クラスには、1 つのプロパティを除いて、必要なすべての機能が含まれています。Record.ID
開発者は、現在の主キーを正しいタイプ (uint
またはGuid
) として読み取ることができます。
これを実現するには、次のような 3 つのクラスを作成する必要がありました (単純化された例)。
class Record {
... lots of code ...
}
class RecordInt : Record {
public uint ID { get; set; }
}
class RecordGuid : Record {
public Guid ID { get; set; }
}
これは問題なく動作しますが、データ モデルが汎用Record
インスタンスを作成できないという問題が発生しました。派生クラスがRecordInt
またはを期待しているかどうかを知る必要がありRecordGuid
ます。そこで、このようなモデルにテンプレート引数を追加しました。
class abstract class Model<T> : were T : Record, new()
{
... lots of generic code that uses T ...
// example
public List<T> Find(...) {
.. find a record ...
return new List<T>();
}
}
これは、単純に 2 つのタイプを持つことの利点よりも多くの問題を引き起こしましたRecord
。モデルをインスタンス化するとき、コードは必要なタイプを認識しているRecord
必要があります。それが一般的なセクションで行われる場合は、別のテンプレート引数を追加する必要があります。
しばらくすると、テンプレート引数を使用するメソッドがたくさんあることに気付きました。型を に渡すことができるようにするためだけにModel<RecordGuid>
、実際にそれを必要とするコードに到達する前に、テンプレート引数をいくつかのメソッド呼び出しのチェーンに渡す必要がある場合があります。
私がやっていることよりも効果的なパターンはありますか?
編集:
がテンプレート引数を使用する理由の 1 つModel
は、 のコレクションを返すメソッドが必要だからですRecord
。C# では にキャストできないため、戻り値の型としてテンプレート引数を使用する必要がList<Record>
ありました。List<RecordGuid>
List<T>