C#通用方法歧义

时间:2012-09-14 10:51:04

标签: c# interface

我需要在同一个界面中使用泛型方法和非泛型方法。

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);

1 个答案:

答案 0 :(得分:3)

  

我需要在同一个界面中使用泛型方法和非泛型方法。

我认为这不是问题,真的。我认为真正的问题是你在同一个类中使用不同的类型参数多次实现相同的通用接口。没有这方面,你就不会有问题。

您可以使用显式接口实现:

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

但这很快变得丑陋。如果可能的话,我会尽量避免这样做。尝试使用合成而不是继承。

另请注意:

  • 如果这是System.Collections.Hashtable,您应该尽可能使用System.Collections.Generic.Dictionary<,>
  • 方法名称add不符合.NET命名约定