我想写一个 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的段落。
答案 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;
}
}
,您会发现有关此类方法的大量信息