對於方法重寫和OOP原則的有效性,我有一個小混亂。 我知道所有關於密封,陰影,覆蓋,虛擬等,但我碰到一個場景,只是困惑我。假設我有:關於重寫規則的混淆C#
class classA
{
public virtual void sayhello()
{
Console.WriteLine("hello I'm A");
}
};
class classB :classA
{
public override void sayhello()
{
Console.WriteLine("hello I'm B");
}
};
class Program
{
static void Main(string[] args)
{
classB a = new classB();
a.sayhello();
}
}
據我迄今研究一切,一個方法聲明爲虛擬或摘要(抽象類)可使用覆蓋關鍵字在子類中重寫。根據這個,上面的代碼工作完美。 當我除去虛擬關鍵字,然後嘗試使用覆蓋覆蓋關鍵字的方法,則編譯器給出誤差爲:
不能覆蓋繼承的成員「inheritence.classA.sayhello()」,因爲它是沒有標明虛擬,抽象或重寫
,然後我刪除了覆蓋關鍵詞,從子類,並提供了實現的:
class classB :classA
{
public void sayhello()
{
Console.WriteLine("hello I'm B");
}
};
在這種情況下,該方法可能會被覆蓋。我可以重寫該方法,它不是虛擬的或抽象的。所以,我的問題是:
1.它不違反OOP原則嗎?因爲我可以覆蓋該方法,該方法在父項中未標記爲虛擬。
2.爲什麼我被允許以這種方式重寫該方法?甚至沒有標記虛擬?
去除CLASSA方法虛擬關鍵字,它給了我密封方法的感覺CLASSA,當我試圖重寫方法CLASSB。 (正如我前面提到的編譯器錯誤)。如果我刪除虛擬,以便子類可能不會覆蓋它,那麼爲什麼孩子類可以巧妙地覆蓋它,刪除其覆蓋關鍵字?這是唯一的情況下,密封關鍵字是專爲?
您執行了一種稱爲方法隱藏的概念http://msdn.microsoft.com/en-us/library/aa691135%28v=vs.71%29.aspx – Samuel
是的,但是這不是違反了oop priciples嗎?比方說,classA不想讓它的方法被隱藏起來?或者爲什麼我們然後使用** new **關鍵字來進行遮蔽,當我們可以簡單地隱藏它時? – Zeeshan
@ O.R.Mapper是的。因爲OP的實例類型爲'classB' –