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

本文关键字:何正确 实现 接口 对象 | 更新日期: 2023-09-27 17:54:46

我有两个接口:

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

如何在List<MyObject> objects上调用MyUtilityClass.MySpecialMethod() ?有没有可能不进行所有类型转换?MyUtilityClass.MySpecialMethod()的参数似乎是问题所在(我想将参数定义为实现issomething的对象列表)。

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

您可以使用IEnumerable<>接口代替List<>IEnumerable<>是协变的

List不支持协方差

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

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

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

调用:

objects.MySpecialMethod();

不应该

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

工作吗?