0

同じインターフェイスでジェネリック メソッドと非ジェネリック メソッドを使用する必要があります。

public interface IBRClientActions<T>
    where T : class 
{
    T add(T element);
    Hashtable add(Hashtable hashtable);

    void update(T element);
    void update(Hashtable hashtable);
}

このインターフェイスを多くの型を持つ他のインターフェイスに実装した後

public interface IBRClientActions : IBRClientActions<AdresseClient>,
                                    IBRClientActions<Role>,
                                    IBRClientActions<LienClient>
{
    ...
}

私の最終クラスでは、そのようなものが必要です

public class FinalClass : IBRClientActions
{
    AdresseClient add(AdresseClient element) { ... }
    Hashtable add**<AdresseClient>**(Hashtable hashtable) { ... }
    ....
}

しかし、Hashtable add<AdresseClient>(Hashtable hashtable) { ... } それは不可能です。実際には、Hashtable を使用したメソッドであいまいな参照があります。

タイプごとに Hashtable を使用して add メソッドを作成するにはどうすればよいですか?


編集 1

明示的なインターフェースの実装

はい、可能ですが、このソリューションでは毎回クラスをキャストする必要があります

Hashtable htRole = new Hashtable();
FinalClass myClass = new FinalClass();

/* not correct, ambiguity */
myClass.add(htRole);

/* correct, no ambiguity but heavy writing (sorry for my bad english) */
((IBRClientActions<Role>)myClass).add(htRole);
4

1 に答える 1

3

同じインターフェイスでジェネリック メソッドと非ジェネリック メソッドを使用する必要があります。

それは問題ではないと思います、本当に。本当の問題は、同じクラスで異なる型引数を使用して同じジェネリック インターフェイスを複数回実装していることだと思います。その側面がなければ、ここで問題はありません。

明示的なインターフェース実装を使用できます。

Hashtable IBRClientActions<Role>.add(Hashtable hashatable)
{
    ...
}

しかし、これはすぐに醜くなります。可能であれば、これを避けるようにします。継承の代わりに構成を使用してみてください。

また、次の点に注意してください。

  • これがの場合、可能であればSystem.Collections.Hashtableおそらく使用する必要がありますSystem.Collections.Generic.Dictionary<,>
  • メソッド名addが .NET 命名規則に準拠していません
于 2012-09-14T10:52:57.037 に答える