在 C# 中通过继承将私有方法添加到类
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 == 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.doMethodB
protected
方法。 但我在想你已经知道了;-) (由于测试问题,我仍然倾向于组合而不是继承)。
我认为您正在寻找的概念是protected
访问修饰符。这意味着只有 B 本身及其派生类可以访问该方法,但其他类不能。
class B {
protected virtual void DoMethodB() {}
}
class A : B {
virtual void DoMethodA() {
DoMethodB();
}
}
如果需要,可以进一步限制对protected internal
的访问,这意味着只能从程序集内的派生类访问该方法。
另外,请注意虚拟方法的后果。如果没有明确需要使方法成为虚拟方法,则不应将其标记为虚拟。
- 计算机使用什么方法添加无符号整数
- 将动态方法添加到类中:使用宏函数到头文件中
- 将本机方法添加到 OpenJDK 源代码
- 如何在不更改类模板的情况下为模板类的模板方法添加第二种类型?
- STD :: MAP-使用下标操作员与插入方法添加元素
- C++ 特征:为什么可以为方法添加赋值,但不能为方法添加 Diagonal()
- 将方法添加到特定类型的模板化类
- 如何将数据从公共方法添加到同一类中的私有成员数组中?
- 将方法添加到类模板专业化中
- 我的类中有方法的指针数组,但我不能调用我的方法.代码如下
- 在 C# 中通过继承将私有方法添加到类
- 将方法添加到与继承方法相同的子类
- 如何将序列化方法添加到作为Windows数据结构的类成员中,以便在C++中与boost序列化一起使用
- 如何处理一个子类有方法,而另一个没有方法的子类?
- 有方法的类,我不明白类的外观
- 是否有方法为模板参数指定所需的定义
- C++ - 有没有办法将字段\方法添加到使用"typedef"定义的类型?
- 通过模板参数将方法添加到类中
- 为特定虚拟方法添加更多参数
- 是否有方法将相对库路径添加到可执行文件以避免设置LD_library_path