正确的方法来禁用基类功能

时间:2015-12-10 10:33:12

标签: oop solid-principles

说,我class A方法M

private void M()
{
    Do1();
    Do2();
}

class B延伸A

问题:Do2()的实例调用时,我需要B不执行。

我有几个想法,但不确定哪些不会违反OOP和SOLID规则。

Do2设为虚拟。

class A
{
    protected virtual void Do2()
    {
        // Do something
    }
}

class B
{
    protected override void Do2()
    {
        // Do nothing
    }
}

这个解决方案对我来说看起来很奇怪,因为我覆盖了一个方法,什么都不做",当需要覆盖时,做某事而不是做某事"或者"除了某些事情之外还做一些事情"。

创建bool受保护的标志属性

class A
{
    protected virtual NeedCallDo2
    {
        get { return true; }
    }

    private void M()
    {
        Do1();

        if (NeedCallDo2)
        {
            Do2();
        }
    }
}

class B
{
    protected override NeedCallDo2
    {
        get { return false; }
    }
}

这个解决方案也不完美,但我可以控制执行流程,可以决定是否调用Do2

传递构造函数标志参数

class A
{
    private bool needCallDo2;

    protected A(bool needCallDo2 = true)
    {
        this.needCallDo2 = needCallDo2;
    }

    private void M()
    {
        Do1();

        if (this.needCallDo2)
        {
            Do2();
        }
    }
}

class B
{
    public B()
        : base(false)
    {
    }
}

2 个答案:

答案 0 :(得分:1)

这是一个棘手的问题!给定标记,有正确的方法来禁用基类功能,因为这会违反,即SOLID中的L。

答案 1 :(得分:0)

您可以将执行逻辑移动到执行策略类,其中B类使用与A类不同的策略实现。