昨天我问过this question,但我认为目前还不清楚我最关心的是什么。在C ++中,我们有私有和多重继承,这使我们能够通过继承从声明这些方法的类继承私有方法。也就是说,如果有一个类
class B {
public:
virtual void doMethodB();
};
和一个班级
class A : private B {
virtual int doMethodA();
};
doMethodB()
可以在doMethodA()
内调用,但无法从外部访问。
现在,我想在C#中模仿这种行为。没有多重或私有继承。要知道,我可以想到四种方法来实现类似的东西,但仍有严重的缺点:
首先:使用interface
,即
interface IB {
public void doMethodB();
};
class A : IB {
public void doMethodB();
int doMethodA();
};
但是,当我们执行此操作时,doMethodB()
为public
,必须在继承自IB
的类中实现。
第二:使用静态方法
public static class B {
public static void doMethodB();
};
这样,只需要一个实现,但该方法仍然是公开的,不能限制在某些类中。
第三:使用扩展方法,例如that。但是,这种方法称为 on 对象(即a.doMethodB()
),而不是“inside”。
第四:作文。
class A {
private B b;
public int doMethodA();
};
现在,B
的方法只能从b.doMethodB()
调用A
,但现在有关序列化的其他问题,b == null
等。
还有另一种选择吗?如果不是,那么你提出的那个中哪一个会考虑“最好的”?
答案 0 :(得分:2)
关于带接口的“第一”提议:您还可以显式实现接口: “实现接口的类可以显式实现该接口的成员。当显式实现成员时,不能通过类实例访问它,而只能通过接口的实例访问它。” 请参阅/来源:http://msdn.microsoft.com/en-us/library/aa288461%28v=vs.71%29.aspx
但是,我会选择合成方法。 “赞成组合而不是继承”,另见Prefer composition over inheritance?
理想情况下,我会通过依赖注入将构造函数注入B
到A
,这有助于缓解您的b == null
问题。
注意:
使用静态方法/扩展方法(也是一种静态方法......)使得单元测试A
(分别伪造B
)非常困难,这就是我完全放弃这些解决方案的原因。 / p>
编辑:
如果您不需要B.doMethodB
以外的任何人访问A
,您还可以B
abstract
课程和B.doMethodB
protected
方法。
但我以为你已经知道了;-)
(并且由于测试问题,我仍然赞成合成而不是继承)。
答案 1 :(得分:1)
我认为您正在寻找的概念是protected
访问修饰符。这意味着只有B本身及其派生类才能访问该方法,但其他人则不能。
class B {
protected virtual void DoMethodB() {}
}
class A : B {
virtual void DoMethodA() {
DoMethodB();
}
}
如果需要,可以进一步限制对protected internal
的访问,这意味着只能从程序集内的派生类访问该方法。
另外,请注意虚拟方法的后果。如果没有明确需要将方法设为虚拟,则不应将其标记为虚拟。