我正在巩固我对Liskov Substitutional校长和开放关闭校长之间关系的理解。如果有人可以证实我的推论,并在下面回答我的问题,那很好。了解Liskov和OCP之间的关系
我有以下类。如您所见,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替换原则吗?
干杯