说,我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)
{
}
}
答案 0 :(得分:1)
这是一个棘手的问题!给定solid-principles标记,有无正确的方法来禁用基类功能,因为这会违反liskov-substitution,即SOLID中的L。
答案 1 :(得分:0)
您可以将执行逻辑移动到执行策略类,其中B类使用与A类不同的策略实现。