3

既存の質問でユースケースが見つからなかったので、ここに進みます。私はこのようなジェネリックスを持つ抽象クラスを持っています:

public abstract class aParameter<T>
{
    private T _parameter;

    public T Parameter
    {
        get { return _parameter;}
    }

    ...
}

次に、次のような「型」クラスがあります。

public class IntParameter : aParameter<Int32>
{
    public IntParameter(Int32 value)
    {
        _parameter = value;
    }
}

 public class TextParameter : aParameter<String>
{
    public TextParameter(String value)
    {
        _parameter = value;
    }
}

ここで、アプリケーションコードで、ジェネリック型を指定せずに、抽象ジェネリッククラスを使用して辞書を作成したいと思います。このような :

...
private Dictionary<Int32, aParameter> _paramDict = new Dictionary<Int32, aParameter>();
...

以前のバージョンでは、の抽象クラスの代わりにインターフェイスを使用してaParameterいましたが、「型」クラスを単純化し、「型」ごとに同じコードを繰り返さないように、抽象クラスに移行したいと考えていました。

ここで何か考えはありますか?

編集

会社全体に配布することを目的としたライブラリの一部になることを忘れたので、許可されたタイプを本当に保護する必要があります。私は自分のコードに単にobjectsフィードされることを許可することはできません。

4

3 に答える 3

6

オブジェクトの操作をやめない限り、おそらく非ジェネリック インターフェイス (または Brandon が言うように非ジェネリック抽象基本クラス) が必要になるでしょう。

その理由は、それaParameter<String>は と同じ型ではないaParameter<int32>ため、何らかの助けなしにそれらを 1 つの辞書に入れることができないからです。

これに対する私の推奨方法は、非ジェネリック インターフェイスを宣言し、それをディクショナリの基礎として使用してから、型指定された各ジェネリックと抽象基本クラスに実装することです。そうすれば、可能な場合は基本クラスから継承するか、型の 1 つが別のものから継承する必要がある場合はインターフェイスを実装するだけで、最大限の柔軟性が得られます。

于 2012-12-20T09:58:44.373 に答える
4

非ジェネリック抽象基本クラスを作成し、ジェネリック抽象クラスにそれを継承させます。

于 2012-12-20T09:58:56.517 に答える
0

ジェネリック型の目的は (とりわけ)、複数の型に使用できるコードを 1 回だけ記述できるようにすることです。ただし、C# は強力な型であるため、コンパイラはジェネリック クラスでどの型を扱っているかを知る必要があります。これが、ジェネリックの型を指定する必要がある理由です (つまり、角括弧内の型)。ジェネリックの型を指定しないと、この例では、コンパイラは Parameter プロパティの型を認識しません。

まさにあなたがそれを使って何をしているかに応じて、いくつかの可能なアプローチがあります:

  1. を使用しDictionary<int, object>ます。値を読み取るときは、一連の if/else を使用してオブジェクトの特定の型をチェックし、適切な型に変換できます。例えば

    if(obj.GetType() == typeof(TextParameter)) { TextParameter p = obj as TextParameter // 何かをする } else if obj.GetType() == typeof(IntParameter)) { IntParameter p = obj as IntParameter // するもの }

  2. 複数の辞書を持つ。Dictionary<int, TextParameter>Dictionary<int, IntParameter>など

  3. 型に依存しないメソッド/プロパティが aParameter にある場合は、それらを下位レベルの非ジェネリック抽象クラスに移動します。これにより、型変換に頼らなくても、機能の少なくとも一部を得ることができます。

于 2012-12-20T10:16:23.323 に答える