我正在鞏固我對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替換原則嗎?
乾杯