2014年1月27日 星期一

C# - Virtual

在我的文章裡有提到Overwrite和New,在這中間的一個運作原理。這中間的一個關鍵字,就是Virturl。它的用途微軟的說明是「修改方法、屬性、索引子 (Indexer) 或事件宣告,以及允許在衍生類別 (Derived Class) 中予以覆寫。 」例如,這個方法可由任一繼承它的類別來覆寫:


當叫用虛擬方法時,會檢查物件的執行階段型別的覆寫成員。 會呼叫大多數衍生類別裡的覆寫成員,而且如果衍生類別都沒有覆寫成員,這可能是原始成員。
根據預設,方法是非虛擬的。 您不能覆寫非虛擬方法。
virtual 修飾詞 (Modifier) 不能與 static、abstract, private 或 override 等修飾詞一起使用。 下列範例說明虛擬屬性:


public class BaseClass
{
    public virtual string GetString()
    {
        return "這是一個方法。";
    }
}


public class DerivedClass : BaseClass
{
    public override string GetString()
    {
        return "這是重寫了方法。";
    }
}

重寫又稱覆蓋、改寫。

  • virtual 用在基類中,指定一個虛方法(屬性),表示這個方法(屬性)可以重寫。
  • override 用在派生類中,表示對基類虛方法(屬性)的重寫。

以上的基底類和派生類都是相對的。B 是 C 的基類,也可以是 A 的派生類,B 中既可以對 A 中的 virtual 虛方法用 override 重寫,也可以指定 virtual 虛方法供 C 重寫。

  • 不能重寫非虛方法或靜態方法。重寫的基底方法必須是 virtual、abstract 或 override 的。為什麼 override 也可以重寫呢?因為基底類別中的 override 實際上是對基類的基類進行的重寫,由於繼承可傳遞,所以也可以對基類中 override 的方法進行重寫。
  • override 聲明不能更改 virtual 方法的可訪問性。override 方法和 virtual 方法必須具有相同的訪問級別修飾符。
  • 不能使用修飾符 new、static、virtual 或 abstract 來修改 override 方法。
  • override屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,並且被重寫的屬性必須是 virtual、abstract 或 override 的。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言