C#-继承和接口

时间:2018-10-05 18:04:05

标签: c# inheritance interface

对不起,标题不好,但我不知道如何用好方法来称呼它。

设置以下接口:

interface IFoo
{
}

interface IBar
{
}

以及以下类别:

class Base
{
}

class Derived1 : Base, IFoo, IBar
{
}

class Derived2 : Base, IFoo, IBar
{
}

我需要为Derived1Derived2建立一个通用类型,并具有BaseIFooIBar的所有功能。这样我就可以将Derived1Derived2的实例放入同一个集合中,而无需执行某些操作就可以访问BaseIFooIBar的功能反射黑魔法。

如果Base是一个接口,那么我只需要创建一个需要实现BaseIFooIBar的接口,但这不是事实。

我也不想在Derived1 / Derived2Base之间拥有中间继承:

class Intermediate : Base, IFoo, IBar
{
}

class Derived1 : Intermediate
{
}

class Derived2 : Intermediate
{
}

因为我处在Unity的上下文中,所以在任何地方都应该避免继承。

我也无法修改Base

我考虑过拥有一个IBase接口,该接口需要Base的所有功能,并且拥有一个“中间”接口也需要实现它,即:

interface IIntermediate : IBase, IFoo, IBar
{
}

class Derived1 : Base, IIntermediate
{
}

class Derived2 : Base, IIntermediate
{
}

但是我必须将Base(及其父代)的所有功能复制到IBase中,并且IBase也不会是Base。这样看起来有点脏,可能会导致我看不到的问题。

除了上面提到的两种可能性之外,我还有其他方法可以实现我需要做的事情?谢谢!

1 个答案:

答案 0 :(得分:1)

带有隐式运算符的类如何能够构造并返回所有所需的类型呢?

class MyBase : IFoo, IBar
{
    Base innerValue;
    public static implicit operator Base(MyBase value)
    {
        return value.innerValue;
    }

    public static implicit operator MyBase(Derived1 value)
    {
        return new MyBase(value);
    }

    public static implicit operator MyBase(Derived2 value)
    {
        return new MyBase(value);
    }

    public MyBase(Derived1 value)
    {
        innerValue = value;
    }
    public MyBase(Derived2 value)
    {
        innerValue = value;
    }
    // Implement IFoo and IBar based on innerValue calls
}

这将允许您创建如下数组:

MyBase[] myArray = new MyBase[] {new Derived1(), new Derived2()};

并且您仍然可以将每个实例视为基础:

Base B1 = myArray[0];