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

C# 是否可以使一个参数实现两个接口?,c#,.net,interface,parameters,C#,.net,Interface,Parameters,是否可以定义一个函数,该函数接受一个必须实现两个接口的参数 (这两个界面是我刚记起来的,不是我想用的) 您可以从这两个接口继承另一个接口,并使您的参数实现该接口。您可以: 1) 定义一个继承两个必需接口的接口: public interface ICombinedInterface : IComparable, ICollection {... } private void DoSomething(ICombinedInterface input) {... } 2) 使用泛型: priva

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

(这两个界面是我刚记起来的,不是我想用的)


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

您可以:

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

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

private void DoSomething(ICombinedInterface input) {... }
2) 使用泛型:

private void DoSomething<T>(T input)
    where T : IComparable, ICollection
{...}
private void DoSomething(T输入)
其中T:i可比较,i集合
{...}
嗯,是的,也不是

正如Steve所建议的,您可以创建另一个第三个接口,该接口从您想要的两个接口派生,并将其用于参数类型

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

换句话说,这是行不通的:

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 { }
}
公共类您的类
{
公共无效测试(ti),其中T:I1,I2{}
}

现在它可以工作了。不过,我仍然不能100%确定这不会给您带来其他问题,我必须考虑一下。

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


如果可能需要这样的场景,最好的方法是为每个通用例程提供一个非通用的对应程序,该程序将接受例如IFoo类型的参数,并根据需要将其转换为IBar。然后可以将所有项存储在一个列表中,并将它们传递给例程。您可能会失去泛型方法的类型安全性,但有时无法实现完美的类型安全性。

在VB.Net中:私有子DoSomthing(t的{IComparable,ICollection})(ByVal输入为t)。。。使用这些解决方案中的一个比使用两个单独的参数有增益吗?从直觉上看,这似乎很有用,但我正在努力想一个具体的例子。我现在想不出一个,但几天前我确实想这么做。使用一个参数看起来比调用DoSomthing(testData,testData)更好,因此只需在两次中传递同一个实例。1)只有在您可以更改实现两个接口的所有类以实现新接口的情况下才有效。2) 如果你能改变所有实现两个接口的类来实现新的接口,我喜欢通用的routeonly,当然,不是所有的类都必须实现。您可以使用,尽管这种方法需要实现类来选择模式。
public class YourClass
{
    public void Test<T>(T i) where T: I1, I2 { }
}