【发布时间】:2013-08-31 14:30:52
【问题描述】:
考虑我们有抽象base class A 和虚拟方法foo1() 调用其他一些虚拟方法foo2()。(foo1 和 foo2 在基类级别实现,但也是虚拟的)
我还有class B,它是继承自class A 的具体类。
现在,Class A 继承了foo1()(当然还有foo2(),但是如果我想做与foo1() 相同的操作,但这次调用foo3() 而不是foo2(),我该怎么做这样做的最佳实践/设计是什么?
我看到了一些选项,猜猜有更好的选择
覆盖
class B中的foo1() 并编写与base.foo1()中相同的代码,但将foo2()的调用更改为foo3()--> 这是一些代码重复,因为所有代码都相似,除了调用到foo2()或foo3()。在具体的 B 类中覆盖
foo2()。
这是否意味着现在继承的foo1()将午餐foo2()class B的覆盖版本,或者它仍将执行相同级别的class A?
这是选项 2 的代码示例:(更像是伪代码)
public abstract Class A
{
public virtual void foo1()
{
doing some actions123
foo2();
doing some actions4
}
public virtual void foo2()
{
Console.writeln("Class A foo2");
}
}
public Class B : A
{
public override void foo2()
{
foo3();
}
public void foo3()
{
Console.writeln("Class B foo3");
}
}
public static void main()
{
B bClass = new B();
B.foo1();
}
谢谢
【问题讨论】:
-
总是调用最被覆盖的实现。所以选项 2 会起作用。
标签: c# oop inheritance virtual object-oriented-analysis