C#,对象和多个接口实现:如何正确使用?

时间:2011-05-03 22:01:41

标签: c# interface

所以我有两个接口:

public interface ISomething
{
    public int A();
}


public interface ISomethingElse
{
    public int B();
}

一个实现两者的对象:

public class MyObject : ISomething, ISomethingElse
{      
}

现在我有了这个正在运行的代码:

...
List<MyObject> objects = myObjectManager.SelectAll(); // now have say 10 MyObject

MyUtilityClass myUtilityClass = new MyUtilityClass();
MyOtherUtilityClass myOtherUtilityClass = new MyOtherUtilityClass();
myUtilityClass.MySpecialMethod(objects);                  // <- compile failure
myOtherUtilityClass.MySpecialMethod(objects);             // <- another failure
...

如果我想在所有这些上调用A或B,我该如何编写这样的代码:

public class MyUtilityClass
{
    public void MySpecialMethod(List<ISomething> objects) // <- the problem
    {
        foreach (ISomething o in objects)
            o.A();   
    }
}

public class MyOtherUtilityClass
{
    public void MySpecialMethod(List<ISomethingElse> objects) // <- the problem
    {
        foreach (ISomethingElse o in objects)
            o.B();   
    }
}

如何在MyUtilityClass.MySpecialMethod()上干净地致电List<MyObject> objects?没有所有类型转换是否可能? MyUtilityClass.MySpecialMethod()的参数似乎是问题(我想将参数定义为实现ISomething的对象列表)。

4 个答案:

答案 0 :(得分:5)

您可以使用IEnumerable<>界面代替List<>IEnumerable<>是协变的。

答案 1 :(得分:4)

列表不支持协方差

您可以将其更改为IEnumerable<ISomething>并传递List<MyObject>

答案 2 :(得分:4)

就个人而言,我会使用以下签名,因为IEnumerable<T>是协变的:

public void MySpecialMethod(this IEnumerable<ISomething> objects) // <- the problem
{
    foreach (ISomething o in objects)
        o.A();   
}

致电:

objects.MySpecialMethod();

答案 3 :(得分:1)

不应该

public void MySpecialMethod(List<MyObject> objects)
{
    foreach (ISomethingElse o in objects)
        o.B();   
}

工作?