代码之家  ›  专栏  ›  技术社区  ›  Virus721

C#-继承和接口

  •  2
  • Virus721  · 技术社区  · 7 年前

    对不起,这个标题不好,但我不知道如何用一种好的方式来命名它。

    interface IFoo
    {
    }
    
    interface IBar
    {
    }
    

    以及以下课程:

    class Base
    {
    }
    
    class Derived1 : Base, IFoo, IBar
    {
    }
    
    class Derived2 : Base, IFoo, IBar
    {
    }
    

    Derived1 Derived2 Base , IFoo IBar . 这样我就可以有这两个例子 衍生1 进入同一个集合,并有权访问的功能 底座 伊巴尔

    如果 底座 如果是一个接口,我只需要创建一个需要实现的接口 , 伊福 伊巴尔 ,但事实并非如此。

    我也不想有一个中间继承之间 衍生1 / 底座 :

    class Intermediate : Base, IFoo, IBar
    {
    }
    
    class Derived1 : Intermediate
    {
    }
    
    class Derived2 : Intermediate
    {
    }
    

    我也不能修改 .

    IBase 需要的所有功能的接口 底座 并且有一个“中间”接口也需要实现它,即:

    interface IIntermediate : IBase, IFoo, IBar
    {
    }
    
    class Derived1 : Base, IIntermediate
    {
    }
    
    class Derived2 : Base, IIntermediate
    {
    }
    

    但我必须复制 底座 (及其父母)进入 伊巴斯 伊巴斯 也不会是 底座

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   BlueMonkMN    7 年前

    一个具有隐式运算符的类如何才能构造并返回所有所需的类型。

    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];