2016-10-14 12 views
-1

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)の名​​前がバインディング/コントラクトの一部である他の関連するアスペクトと同様に更新する必要があるため、私は欲しいです。

+0

あなたが実践していることを実践するには、あなたが実証した '使用法 'しかありません。 – itsme86

+1

私は本当にジレンマを見ません。メモ帳を使用していない限り、使用しているIDEはタイプの名前を変更するときに、どんなタイプの 'ConcreteType'エイリアスの名前も変更することができます。 – itsme86

+1

_ "でも、これはまだ非常に冗長であり、例えばConcreteTypeの名前が" _ - 何を意味するか?実際の型名が変更された場合は、別名宣言でのみ変更する必要があります。しかし、それはあなたのIDEの通常のリファクタリング/名前変更機能を使用して自動的に行う必要があります。エイリアス名自体を変更したい場合は、リファクタリング/名前変更の機能もうまく動作するはずです。何がそんなに難しい?あなたが避けることができ、現在は型名エイリアスを使用していないと思われることを避けようとしているのは何ですか? –

答えて

0

usingエイリアスの外では、言語(C#)はこの名前インダイレクションをサポートしていません。

C#(.NET)プロジェクトをビルドするときにプリプロセッサを使用するのは一般的ではなく、開発ツールを使用してこの「作業」を促進するのが一般的な方法です。タイプの定義が単一のソースファイル、または単一のアセンブリに存在する必要はないことを考慮すると、開発ツールはこれを管理するための最良のアプローチと思われます。

投稿者の回答に感謝します。

関連する問題