我正在巩固我对 Liskov Substitutional Principal 和 Open Close Principal 之间关系的理解。如果有人能证实我的推论并回答我下面的问题,那就太好了。
我有以下课程。如您所见,B
它派生自A
并覆盖该DisplayMessage
函数以改变行为。
public class A
{
private readonly string _message;
public A(string message)
{
_message = message;
}
public virtual void DisplayMessage()
{
Console.WriteLine(_message);
}
}
public class B : A
{
public B(string message) : base(message){}
public override void DisplayMessage()
{
Console.WriteLine("I'm overwriting the expected behavior of A::DisplayMessage() and violating LSP >:-D");
}
}
现在在我的引导程序中,ShowClassTypeis
期待一个类型的对象,A
它应该有助于写出它是什么类类型。然而B
,它违反了 LSP,所以当它的DisplayMessage
函数被调用时,它会打印一条完全出乎意料的消息,并且本质上会干扰ShowClassType
.
class Program
{
static void Main(string[] args)
{
A a = new A("I am A");
B b = new B("I am B");
DoStuff(b);
Console.ReadLine();
}
private static void ShowClassType(A model)
{
Console.WriteLine("What Class are you??");
model.DisplayMessage();
}
}
所以我的问题是,我的结论是否正确,ShowClassType
因为现在 B 型可以进入并更改该方法的预期功能,它不再关闭以进行修改(即确保它保持它的预期的行为,你必须改变它,以便它首先检查以确保我们只使用原始 A 对象)?
或者,相反,这只是一个很好的例子来表明它ShowClassType
是封闭的,并且通过传入派生类型(尽管 LSP 违反了)我们已经扩展了它的意图?
最后,如果基类不是抽象的,在基类上创建虚函数是不好的做法吗?通过这样做,我们不只是在邀请派生类违反 Liskov Substitution 原则吗?
干杯