[英]Why can I abstract override an abstract method?
我有一個抽象的基類:
abstract class Foo
{
virtual void DoSomeStuff()
{
//Do Some Stuff
}
abstract void DoSomeCrazyStuff();
}
另一個抽象類派生自:
abstract class Bar : Foo
{
abstract override void DoSomeStuff();
abstract override void DoSomeCrazyStuff();
}
我理解你為什么要抽象覆蓋DoSomeStuff()
- 它將需要一個新的實現進一步派生類。 但我無法弄清楚你為什么要抽象覆蓋DoSomeCrazyStuff()
。 據我所知,這是多余的 - 我很確定刪除它會產生零負面影響。
是否有一些用例,抽象覆蓋在抽象上有用嗎? 如果沒有,為什么沒有編譯器警告通知我,我寫的東西什么都沒做?
為什么我可以抽象覆蓋抽象方法?
對於初學者來說,沒有任何實際的理由可以阻止它。 如果它產生了編譯器錯誤,那么所做的就是讓類變得更脆弱。 例如:
abstract class Foo
{
virtual void DoSomeStuff()
{
//Do Some Stuff
}
}
abstract class Bar : Foo
{
abstract override void DoSomeStuff();
}
如果抽象的抽象覆蓋是非法的,將Foo上的DoSomeStuff更改為abstract現在會阻止Bar編譯。 抽象覆蓋是多余的,但沒有潛在的負面影響,所以編譯器對此沒問題。
為什么沒有編譯器警告告訴我我寫的東西什么都沒做?
編譯器為某些代表風險的事物產生警告:非顯式方法隱藏,無法訪問的代碼,使用過時的方法等。唯一的“問題”是不必要的抽象覆蓋可能表明代碼沒有被有效寫入。 這不是編譯器所關心的。
是否有一些用例,抽象覆蓋在抽象上有用嗎?
不是功能性的。 但是,有一些用例可能會故意這樣做:
通過在Bar
明確地abstract override
它,你可以確保它被Bar
的后代視為抽象,即使將來在Foo
它可能會變成非抽象的。 盡管有這樣的改變, Bar
的后代將使用同樣的合同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.