是否有类似可以实现的类?

时间:2015-04-21 09:02:24

标签: c# inheritance interface abstract multiple-inheritance

我想写一个 X级(本)其中 继承自A (基础)可以 执行B (?)的方法并且必须为 实现C (接口)的成员。

实现A和C不是问题。但是由于X不能从多个类派生,所以X似乎不可能继承A和B的逻辑。注意A是非常重要的基类,B几乎是一个接口但包含可执行行为。我不希望B成为接口的原因是因为每个继承或实现它的类的行为都是相同的。

我是否真的必须将B声明为接口并为每个需要B行为的X实现完全相同的10行代码?


2个月后
我目前正在学习C ++,以便在UE4(虚幻引擎4)中使用它 由于C ++比C#严格得多,它实际上包含描述此行为的模式 实现 idom 术语:这些被称为 mixin 秒。

您可以在第9页(第二段)上阅读有关C ++ mixin here的段落。

2 个答案:

答案 0 :(得分:5)

  

我是否真的必须将B声明为接口,并为需要X行为的每个B实现完全相同的10行代码?

是和否。您需要使B成为一个界面。但是,不应在所有接口实现中复制常见的方法实现。相反,他们应该进入接口B的类扩展:

public interface B {
    void MethodX();
    void MethodY();
}
public static class ExtensionsB {
    public static void MethodZ(this B b) {
        // Common implementations go here
    }
}

扩展方法提供了一种“水平”共享实现的方法,而不会让您的类继承自第二个类。扩展方法的行为就像它们是类的常规方法一样:

class X : A, B {
    public void MethodX() {...}
    public void MethodY() {...}
}
public static void Main(string[] args) {
    var x = new X();
    x.SomeMethodFromA();
    x.MethodX(); // Calls method from X
    x.MethodY(); // Calls method from X
    x.MethodZ(); // Calls method from ExtensionsB
}

答案 1 :(得分:1)

我认为您最好的选择是在B的构造函数中要求A的实例,然后根据需要公开或调用B的方法:

public class X : A, C
{
    private readonly B _b;

    public X(B b)
    {
        _b = b;
    }
}

如果您查询Composition over inheritance

,您会发现有关此类方法的大量信息