首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 多態核心:繼承與接口兩大支柱,非繼承也能實現「鴨子類型」多態

     編輯:程式設計綜合問答

標準定義

多態:同一操作作用於不同對象,產生不同行為。C# 主要通過兩種機制實現:

1. 繼承多態(子類多態)

  • 基類定義 virtual 方法,派生類 override 重寫。
  • 基類引用指向派生對象,調用時動態分發到派生類實現。
class Animal { public virtual void Speak() => Console.WriteLine("..."); }
class Dog : Animal { public override void Speak() => Console.WriteLine("Wang"); }
Animal a = new Dog(); a.Speak(); // 輸出 Wang

2. 接口多態(契約多態)

  • 定義接口契約,不同類實現同一接口。
  • 接口引用指向實現類對象。
interface ISpeakable { void Speak(); }
class Cat : ISpeakable { public void Speak() => Console.WriteLine("Miao"); }
class Robot : ISpeakable { public void Speak() => Console.WriteLine("Beep"); }
ISpeakable s = new Cat(); s.Speak(); // Miao

非繼承多態:鴨子類型 / 結構化多態

C# 7.0+ 模式匹配、動態類型 dynamic、委托/Func 均可在無繼承關系下實現多態行為:

// 模式匹配 (C# 7+)
void MakeSound(object o) {
    switch (o) {
        case Dog d: d.Speak(); break;
        case Cat c: c.Speak(); break;
        default: Console.WriteLine("Unknown");
    }
}

// 委托多態
Action speak = () => new Dog().Speak();
speak += () => new Cat().Speak();
speak(); // 依次調用

總結

  • 繼承是最常見、語法糖最豐富的多態方式。
  • 接口解耦更徹底,支持多實現。
  • 非繼承多態通過模式匹配、委托、dynamic 實現,適用於無法修改類源碼、跨類型統一調用場景。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved