【问题标题】:Virtual methods and inhertitance design虚拟方法和继承设计
【发布时间】:2013-08-31 14:30:52
【问题描述】:

考虑我们有抽象base class A 和虚拟方法foo1() 调用其他一些虚拟方法foo2()。(foo1 和 foo2 在基类级别实现,但也是虚拟的)

我还有class B,它是继承自class A 的具体类。
现在,Class A 继承了foo1()(当然还有foo2(),但是如果我想做与foo1() 相同的操作,但这次调用foo3() 而不是foo2(),我该怎么做这样做的最佳实践/设计是什么?

我看到了一些选项,猜猜有更好的选择

  1. 覆盖class B 中的foo1() 并编写与base.foo1() 中相同的代码,但将foo2() 的调用更改为foo3() --> 这是一些代码重复,因为所有代码都相似,除了调用到foo2()foo3()

  2. 在具体的 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


【解决方案1】:

选项 2 是要走的路。覆盖 B 类中的 foo2,每当 A 类中的 foo1 被调用时,它就会调用 B 类中的 foo2。

【讨论】:

    猜你喜欢
    • 2015-09-09
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2016-10-06
    相关资源
    最近更新 更多