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的对象列表)。
您可以使用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();
}
工作吗?