首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 深度解析:abstract、virtual 與 override 關鍵字的差異與應用

     編輯:關於C#

前言

在 C# 物件導向設計中,abstract(抽象)、virtual(虛擬)與 override(覆寫)是實現多型與擴充性的核心關鍵字。本文將系統整理三者的語法規則、行為差異與最佳實務,並搭配程式碼範例說明。

abstract:抽象類別與成員

抽象類別特性

  • 無法實例化,僅能作為基類被繼承。
  • 可包含抽象方法、抽象屬性、索引子與事件。
  • 不可搭配 sealed 修飾詞(否則無法被繼承)。
  • 非抽象衍生類別必須實作所有繼承的抽象成員。

抽象方法特性

  • 隱含為 virtual,但不可明確加上 virtual 或 static。
  • 僅能宣告於抽象類別中,無方法主體,以分號結束:public abstract void MyMethod();
  • 實作由衍生類別的 override 方法提供。

抽象屬性行為類同抽象方法,不可用於靜態屬性,衍生類別以 override 實作。

virtual:虛擬成員

  • 修飾方法、屬性、索引子或事件,允許衍生類別以 override 覆寫實作。
  • 呼叫時依執行階段型別決定調用哪個覆寫版本(動態繫結)。
  • 預設方法為非虛擬,不可覆寫非虛擬方法。
  • 不可與 static、abstract、override 共用。

虛擬屬性語法與抽象屬性相似,衍生類別同樣以 override 覆寫。

override:覆寫基類實作

  • 提供繼承成員的新實作,簽章必須與基類虛擬/抽象/覆寫成員完全一致。
  • 不可覆寫非虛擬或靜態方法。
  • 不可改變虛擬方法的存取層級(如 public 必須維持 public)。
  • 不可搭配 new、static、virtual、abstract。

new:隱藏繼承成員

new 修飾詞用於刻意隱藏基類同名成員,非多型行為。若衍生類別宣告同名成員未加 new,編譯器會發出警告;加上 new 可消除警告並明確表達隱藏意圖。隱藏成員仍存在於基類實例中,透過基類參考呼叫時仍會執行基類版本。

程式碼範例:virtual vs new vs override

using System;

namespace VirtualMethod {
    class BaseClass {
        public void RealMethod() {
            Console.WriteLine("BaseClass RealMethod");
        }
        public virtual void VirtualMethod() {
            Console.WriteLine("BaseClass VirtualMethod");
        }
    }

    class Derived : BaseClass {
        // 隱藏基類 RealMethod
        new public void RealMethod() {
            Console.WriteLine("Derived RealMethod");
        }
        // 覆寫虛擬方法
        public override void VirtualMethod() {
            Console.WriteLine("Derived VirtualMethod");
        }
    }

    class Tester {
        static void Main() {
            BaseClass b = new BaseClass();
            Derived d = new Derived();

            b.RealMethod();      // BaseClass RealMethod
            d.RealMethod();      // Derived RealMethod
            b.VirtualMethod();   // BaseClass VirtualMethod
            d.VirtualMethod();   // Derived VirtualMethod

            Console.WriteLine();

            // 多型行為:基類參考指向衍生實例
            b = d;
            b.RealMethod();      // BaseClass RealMethod (隱藏,非多型)
            b.VirtualMethod();   // Derived VirtualMethod (多型生效)
        }
    }
}

關鍵差異總結

關鍵字用途多型支援基類成員要求
abstract強制衍生類別實作,無預設實作是僅限抽象類別
virtual提供預設實作,允許選擇性覆寫是一般類別即可
override覆寫虛擬/抽象/覆寫成員是基類成員需為 virtual/abstract/override
new隱藏基類同名成員否無限制

最佳實務建議

  1. 設計擴充點時優先考慮 virtual,保留預設行為;若基類不應被實例化且無預設邏輯,改用 abstract。
  2. 覆寫時務必加上 override,避免意外隱藏導致多型失效。
  3. 僅在確定不需多型、刻意要取代基類行為時使用 new,並加上註解說明原因。
  4. 屬性覆寫需保持存取修飾詞、型別、名稱完全一致,且基類屬性必須為虛擬、抽象或覆寫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved