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

C# 教程第 9 課:多型完整指南(虛擬方法、覆寫、基類參考呼叫衍生實作)

     編輯:關於C語言

學習目標

  1. 理解多型概念
  2. 定義 virtual 虛擬方法
  3. 用 override 覆寫
  4. 透過基類參考呼叫衍生類實作

基類:DrawingObject

using System;

public class DrawingObject
{
    public virtual void Draw()
    {
        Console.WriteLine("I'm just a generic drawing object.");
    }
}

virtual 允許衍生類覆寫。

衍生類:Line、Circle、Square

public class Line : DrawingObject
{
    public override void Draw() => Console.WriteLine("I'm a Line.");
}

public class Circle : DrawingObject
{
    public override void Draw() => Console.WriteLine("I'm a Circle.");
}

public class Square : DrawingObject
{
    public override void Draw() => Console.WriteLine("I'm a Square.");
}

每個衍生類用 override 提供專屬實作。

多型示範:DrawDemo

public class DrawDemo
{
    public static int Main()
    {
        DrawingObject[] objs = new DrawingObject[4];
        objs[0] = new Line();
        objs[1] = new Circle();
        objs[2] = new Square();
        objs[3] = new DrawingObject();

        foreach (DrawingObject obj in objs)
            obj.Draw(); // 執行期依實際型別派發

        return 0;
    }
}

輸出

I'm a Line.
I'm a Circle.
I'm a Square.
I'm just a generic drawing object.

關鍵機制解析

  1. 陣列元素型別為基類:DrawingObject[] 可容納所有衍生類實例(Liskov 替換原則)。
  2. 虛擬方法表:CLR 依物件實際型別查找方法槽,呼叫最衍生的覆寫實作。
  3. 非虛擬方法:若基類方法非 virtual,衍生類用 new 隱藏,則透過基類參考呼叫仍執行基類版本(靜態繫結)。
  4. abstract:抽象方法強制衍生類實作,基類不可實例化。

進階補充

  • sealed override:防止進一步覆寫。
  • base.Draw():在覆寫方法中呼叫基類實作。
  • 介面方法預設為虛擬,實作類別隱含 override。
  • 模式比對 (C# 7+):obj switch { Line l => ..., Circle c => ... } 也是多型的一種表達。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved