簡體   English   中英

為什么我可以抽象覆蓋抽象方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM