虚拟方法和固有设计

本文关键字:方法 虚拟 | 更新日期: 2023-09-27 18:29:41

考虑我们有一个抽象的base class A和一个调用其他虚拟方法foo2()的虚拟方法foo1()。(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是可行的。覆盖类B中的foo2,每当调用类A中的foo1时,它都会调用类B的foo2。