C#ジェネリック(具体的にはclass
の型パラメータ)では、汎用型を拡張/継承する特殊( "非汎用")型(class
)の指定型パラメータ値を参照できますか?この例では、継承する(特殊な)タイプの汎用(継承)型のvirtual
メソッドをオーバーライドしています。私はそれが質問/回答にとって重要だと思っていますが、そうでない場合は制限したくありません。C#ジェネリック型から非ジェネリック型へ継承するとき、どのように冗長性を減らすことができますか?
私はちょうどCがtypedef
と呼ぶものを探しているかもしれません。私がC#で考えることができる最も近いものは、using
エイリアス(using Type = Some.Longer.Namespaced.Type;
)です。ここにはusing
エイリアスの例がありますが、これはまだ非常に冗長であり、たとえば次のような場合に更新するのは楽しいことではありません。 ConcreteType
変更(または他のいくつかのリファクタリング、ロジックシフトではなく、ロジック自体の境界/カプセル化)の名:C-スタイルtypedef
またはCPP-スタイルのマクロが本当に何であるよう
using ConcreteType = Some.Longer.Namespaced.Type;
public class ConcreteTypeLogic : CrudLogic<ConcreteType>
{
// default ctor for `ConcreteTypeLogic`
public ConcreteTypeLogic()
{ /* ... */ }
// other ctor for `ConcreteTypeLogic`
/* ... */
// dtor for `ConcreteTypeLogic`
public ~ConcreteTypeLogic()
{ /* ... */ }
// "Create" implementation for `ConcreteType`
public override ConcreteType Create(ConcreteType value)
{ /* ... */ }
// "Read" implementation for `ConcreteType`
public override ConcreteType Read(ConcreteTypeIdentifier valueId)
{ /* ... */ }
/* ... */
}
は、それはそうですConcreteTypeLogic
とコンストラクタ/デストラクタは、型(class
)の名前がバインディング/コントラクトの一部である他の関連するアスペクトと同様に更新する必要があるため、私は欲しいです。
あなたが実践していることを実践するには、あなたが実証した '使用法 'しかありません。 – itsme86
私は本当にジレンマを見ません。メモ帳を使用していない限り、使用しているIDEはタイプの名前を変更するときに、どんなタイプの 'ConcreteType'エイリアスの名前も変更することができます。 – itsme86
_ "でも、これはまだ非常に冗長であり、例えばConcreteTypeの名前が" _ - 何を意味するか?実際の型名が変更された場合は、別名宣言でのみ変更する必要があります。しかし、それはあなたのIDEの通常のリファクタリング/名前変更機能を使用して自動的に行う必要があります。エイリアス名自体を変更したい場合は、リファクタリング/名前変更の機能もうまく動作するはずです。何がそんなに難しい?あなたが避けることができ、現在は型名エイリアスを使用していないと思われることを避けようとしているのは何ですか? –