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

时间:2014-02-20 08:11:18

标签: c# c++ inheritance private-members

昨天我问过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等。

还有另一种选择吗?如果不是,那么你提出的那个中哪一个会考虑“最好的”

2 个答案:

答案 0 :(得分:2)

关于带接口的“第一”提议:您还可以显式实现接口: “实现接口的类可以显式实现该接口的成员。当显式实现成员时,不能通过类实例访问它,而只能通过接口的实例访问它。” 请参阅/来源:http://msdn.microsoft.com/en-us/library/aa288461%28v=vs.71%29.aspx

但是,我会选择合成方法。 “赞成组合而不是继承”,另见Prefer composition over inheritance?

理想情况下,我会通过依赖注入将构造函数注入BA,这有助于缓解您的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的访问,这意味着只能从程序集内的派生类访问该方法。

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