[英]Adding private method to class by inheritance in C#
我昨天问过这个问题 ,但我认为目前还不清楚我的主要关注点是什么。 在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();
};
这样,只需要一个实现,但该方法仍然是公共的,不能限制在某些类中。
第三:使用扩展方法,就像那样 。 然而,这种方法是在对象(即a.doMethodB()
) 上调用而不是从“内部”调用。
第四:组成。
class A {
private B b;
public int doMethodA();
};
现在, B
的方法可以像A
b.doMethodB()
一样b.doMethodB()
,但现在有关序列化的其他问题, b == null
等。
还有另一种选择吗? 如果没有,你提出的那个中哪一个会被认为是“最好的” ?
关于带接口的“第一”提议:您还可以显式实现接口:“实现接口的类可以显式实现该接口的成员。当显式实现成员时,不能通过类实例访问它,但是只能通过界面实例。“参见/来源: http : //msdn.microsoft.com/en-us/library/aa288461%28v=vs.71%29.aspx
但是,我会选择合成方法。 “赞成组合而不是继承”,还看到Prefer组合而不是继承?
理想情况下,我会通过依赖注入将构造函数注入B
到A
,这应该有助于缓解您的b == null
关注点。
注意:使用静态方法/扩展方法(也是一种静态方法......)使得单元测试A
(分别伪造B
)非常困难,这就是为什么我会完全放弃这些解决方案。
编辑:如果你不需要除A
之外A
任何人可以访问B.doMethodB
,你也可以使B
成为abstract
类, B.doMethodB
是protected
方法。 但我以为你已经知道了;-)(并且由于测试问题,我仍然赞成合成而不是继承)。
我认为您正在寻找的概念是protected
访问修饰符。 这意味着只有B本身及其派生类可以访问该方法,但其他人则不能。
class B {
protected virtual void DoMethodB() {}
}
class A : B {
virtual void DoMethodA() {
DoMethodB();
}
}
如果需要,可以进一步限制对protected internal
的访问,这意味着只能从程序集内的派生类访问该方法。
另外,请注意虚拟方法的后果。 如果没有明确需要将方法设为虚拟,则不应将其标记为虚拟。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.