是否可以使参数实现两个接口?

时间:2009-04-21 10:59:49

标签: c# .net interface parameters

是否可以定义一个接受必须实现两个接口的参数的函数?

(这两个接口是我刚想起的那个接口;不是我想要使用的接口)

private void DoSomthing(IComparable, ICollection input)
{

}

4 个答案:

答案 0 :(得分:52)

你可以:

1)定义一个继承所需接口的接口:

public interface ICombinedInterface : IComparable, ICollection {... }

private void DoSomething(ICombinedInterface input) {... }

2)使用泛型:

private void DoSomething<T>(T input)
    where T : IComparable, ICollection
{...}

答案 1 :(得分:5)

您可以从这两个接口继承另一个接口,并使您的参数实现该接口。

答案 2 :(得分:2)

嗯,是的,没有。

正如史蒂夫所建议的那样,您可以创建另一个第三个接口,该接口从您想要的两个接口开始,并将其用于参数类型。

但是,这也要求所使用的类也实现第三个接口。

换句话说,这不起作用:

public interface I1 { }
public interface I2 { }
public class C : I1, I2 { }

public interface I3 : I1, I2 { }
public class YourClass
{
    public void Test(I3 i) { }
}

...
YourClass yc = new YourClass();
C c = new C();
yc.Test(c); // won't work, C does not implement I3

但是,您可以通过泛型来欺骗编译器。

public class YourClass
{
    public void Test<T>(T i) where T: I1, I2 { }
}

现在它会起作用。我仍然不是百分百肯定不会给你其他问题,我必须考虑它。

答案 3 :(得分:1)

上面提到的泛型函数方法是一个很好的方法,有一个重要的注意事项:为了对一个对象进行类型转换以便它可以传递给具有多个通用约束的例程,必须知道满足这些约束的类型,并且要转换的对象的父类型。接受这样一个对象的例程会知道这样一个类型(它作为泛型类型参数传入)但是没有很好的方法让类保留这些信息并在以后使用它。如果各种不相关的类型同时实现IFoo和IBar,那么很难设计一个例程,它可以接受许多不相关的对象实例,将它们存储在列表或其他东西中,然后将列表中的所有项目传递给例程使用通用的IFoo + IBar参数。

如果这种情况可能是必要的,那么最好的方法是为每个通用例程设置一个非通用的对应物,它可以接受例如IFoo类型的参数,并根据需要将其投射到IBar。然后,可以将所有项目存储在List&lt; IFoo&gt;中。并将它们传递给例程。人们会失去通用方法的类型安全性,但有时候无法实现完美的类型安全性。