c# - 在 C# 中使用多个接口(interface)键入多态值

标签 c# interface

是否有任何类型安全的、编译时检查的引用实现多个接口(interface)的值的可能性?

给定

interface A {
    void DoA();
}

interface B {
    void DoB();
}

我能够为实现 A 的对象编写代码 B ,但不是两者。所以我必须想出丑陋的 wrapper :

class ABCollection {
    private class ABWrapper : A, B {
        private readonly A a;
        private readonly B b;

        public static ABWrapper Create<T>(T x) where T : A, B {
            return new ABWrapper { a = x, b = x };
        }

        public void DoA() {
            a.DoA();
        }

        public void DoB() {
            b.DoB();
        }
    }

    private List<ABWrapper> data = new List<ABWrapper>();

    public void Add<T>(T val) where T : A, B {
        data.Add(ABWrapper.Create(val));
    }
}

是否有技巧可以更直观地编写此代码而不会失去类型安全性(运行时强制转换等)?

例如

private List<A and B> ...

编辑:这不是特别要有一个列表——我只是想给出一个“完整”的例子来说明存储这些值的问题。我的问题只是如何键入两个接口(interface)的组合(例如 A & BA and B)。

另一个更有用的例子:List<IDrawable & IMovable> ...

最佳答案

您可以像在 C# 中那样执行参数多态性,但不能子类型多态性。也就是说,您可以创建一个多态方法,例如:

void Foo<T>(T t) where T : IFoo, IBar
{
  t.Foo();
  t.Bar();
}

然后您必须传递一个类型在编译时已知的对象以同时实现 IFoo 和 IBar。

但是没办法说

void Foo(IFoo-and-IBar t) 
{
  t.Foo();
  t.Bar();
}

然后传入一个既是 IFoo 又是 IBar 的值。不错的功能,但我们不支持。

关于c# - 在 C# 中使用多个接口(interface)键入多态值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1882234/

相关文章:

c# - 在列上添加特定的自动过滤器

c# - 在 C# 中更改网络配置

c# - 集合类型的属性

C#:将字段定义为私有(private)但可在泛型中修改

java - 如果我需要初始化子类,如何使用抽象类?

c# - 输入验证 Silverlight

c# - 事件在错误的线程中?

javascript - 防止覆盖提供的内部函数的方法

c# - 让类实现不同接口(interface)以限制客户端操作时的设计问题

c#什么时候编程到接口(interface)?