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

发布于 2024-11-04 21:17:14 字数 1375 浏览 0 评论 0原文

所以我有两个接口:

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我的 List上的 .MySpecialMethod()对象?是否可以不进行所有类型转换? MyUtilityClass.MySpecialMethod() 的参数似乎是问题所在(我想将参数定义为实现 ISomething 的对象列表)。

So I have two interfaces:

public interface ISomething
{
    public int A();
}


public interface ISomethingElse
{
    public int B();
}

And an object that implements both:

public class MyObject : ISomething, ISomethingElse
{      
}

Now I have this running code:

...
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
...

If I want to call A or B on all of them, how can I write code like this:

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

How can I cleanly call MyUtilityClass.MySpecialMethod() on my List<MyObject> objects? Is it possible without all typecasting? The parameters of MyUtilityClass.MySpecialMethod() appear to be the issue (I want to define the parameter as a List of objects that implement ISomething).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

习惯成性 2024-11-11 21:17:14

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

You can use IEnumerable<> interface instead of List<>. IEnumerable<> is covariant.

隔纱相望 2024-11-11 21:17:14

列表不支持协方差

您可以将其更改为 IEnumerable 并传递 List

List does not support covariance.

You may change it to IEnumerable<ISomething> and pass a List<MyObject>.

淡莣 2024-11-11 21:17:14

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

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

调用它:

objects.MySpecialMethod();

Personally, I would use the following signature as IEnumerable<T> is covariant:

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

Calling it:

objects.MySpecialMethod();
悲歌长辞 2024-11-11 21:17:14

不应该

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

工作吗?

Shouldn't

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

work?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文