gpt4 book ai didi

c# - 在C#中通过继承向类添加私有(private)方法

转载 作者:行者123 更新时间:2023-11-30 02:48:37 25 4
gpt4 key购买 nike

我问了this question昨天,但我认为不清楚我最关心的是什么。在 C++ 中,我们有私有(private)继承和多重继承,这使我们能够通过仅从声明这些方法的类继承来向类添加 私有(private) 方法。也就是说,如果有一个类

class B {
public:
virtual void doMethodB();
};

和一个类

class A : private B {
virtual int doMethodA();
};

doMethodB() 可以从 doMethodA() 中调用,但不能从外部访问。

现在,我想在 C# 中模仿这种行为。没有多重继承或私有(private)继承。据了解,我可以想到四种方法来实现类似的东西,但仍然有严重的缺点:

首先:使用接口(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();
};

这样一来,只需要一个实现,但该方法仍然是公共(public)的,不能局限于某些类。

第三:使用扩展方法,比如that .然而,那样的话,该方法是对象上调用的(即a.doMethodB()),而不是“内部”

第四:组合。

class A {
private B b;
public int doMethodA();
};

现在,B 的方法可以像 b.doMethodB() 一样只从 A 调用,但是现在还有关于序列化的其他问题, b == null

还有其他选择吗?如果不是,您认为“最好的”是所展示的哪一个?

最佳答案

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

但是,我会选择合成方法。 “比继承更喜欢组合”,另请参阅 Prefer composition over inheritance?

理想情况下,我会通过依赖注入(inject)将构造函数注入(inject) BA 中,这应该有助于减轻您对 b == null 的担忧。

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

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

关于c# - 在C#中通过继承向类添加私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21901817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com