在 C# 中通过继承将私有方法添加到类

Adding private method to class by inheritance in C#

本文关键字:有方法 添加 继承      更新时间:2023-10-16

我昨天问了这个问题,但我认为不清楚我主要关心的是什么。在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的方法只能像Ab.doMethodB()一样调用,但现在是关于序列化、b == null等的其他问题。

还有其他选择吗?如果没有,您认为所呈现的哪一个是"最好的">

关于你的接口"第一个"建议:你也可以显式地实现接口: "实现接口的类可以显式实现该接口的成员。显式实现成员时,不能通过类实例访问它,而只能通过接口的实例访问它。" 参见/来源: http://msdn.microsoft.com/en-us/library/aa288461%28v=vs.71%29.aspx

但是,我会选择组合方法。"偏爱组合而不是继承",另请参阅更喜欢组合而不是继承?

理想情况下,我会通过依赖注入构造函数B注入A,这应该有助于减轻您的b == null问题。

注意: 使用静态方法/扩展方法(也是一种静态方法...)使单元测试A(分别伪造B)非常困难,这就是为什么我会完全放弃这些解决方案。

编辑: 如果您不需要从除A以外的任何人访问B.doMethodB,您还可以将B设置为abstract类并B.doMethodBprotected方法。 但我在想你已经知道了;-) (由于测试问题,我仍然倾向于组合而不是继承)。

我认为您正在寻找的概念是protected访问修饰符。这意味着只有 B 本身及其派生类可以访问该方法,但其他类不能。

class B {
protected virtual void DoMethodB() {}
}
class A : B {
virtual void DoMethodA() {
DoMethodB();
}
}

如果需要,可以进一步限制对protected internal的访问,这意味着只能从程序集内的派生类访问该方法。

另外,请注意虚拟方法的后果。如果没有明确需要使方法成为虚拟方法,则不应将其标记为虚拟。