1. 繼承的核心定義?
?繼承? 是面向對象編程(OOP)的核心特性之一,允許一個類(稱為?子類/派生類?)基于另一個類(稱為?父類/基類?)構建,自動獲得父類的成員(字段、屬性、方法等),并可通過擴展或修改實現代碼復用和多態行為。
2. C# 繼承的關鍵特性?
特性 | 說明、 |
---|---|
?單繼承? | C# 只支持單類繼承(一個類只能有一個直接基類) |
?接口多繼承? | 一個類可實現多個接口(class A : I1, I2, I3) |
?傳遞性? | 繼承關系可多層傳遞(如 A → B → C) |
?隱式繼承? | 所有類隱式繼承 System.Object(除非顯式指定其他基類) |
?成員可見性控制? | 通過 public、protected、private 等修飾符控制繼承成員的訪問權限 |
?3. 繼承的語法?
// 基類定義
public class Vehicle
{public string Brand { get; set; }public void Start() => Console.WriteLine("Engine started");
}// 派生類繼承基類
public class Car : Vehicle
{public int Wheels { get; set; }public void Drive() => Console.WriteLine("Driving...");
}
?4. 繼承的核心操作?
?(1) 訪問基類成員?
var car = new Car();
car.Brand = "Toyota"; // 繼承自 Vehicle
car.Start(); // 調用基類方法
?(2) 重寫方法(虛方法)?
public class Animal
{public virtual void Speak() => Console.WriteLine("Animal sound");
}public class Dog : Animal
{public override void Speak() => Console.WriteLine("Woof!");
}
?(3) 抽象類與強制實現?
public abstract class Shape
{public abstract double Area(); // 抽象方法(必須實現)
}public class Circle : Shape
{public double Radius { get; set; }public override double Area() => Math.PI * Radius * Radius;
}
?5. 構造函數與繼承?
?(1) 基類構造函數調用?
public class BaseClass
{public BaseClass(int value) { /* 初始化邏輯 */ }
}public class DerivedClass : BaseClass
{// 必須通過 base 調用基類構造函數public DerivedClass(int value, string name) : base(value){Name = name;}public string Name { get; }
}
?(2) 默認構造函數行為?
若基類?沒有無參構造函數?,派生類必須顯式調用基類的有參構造函數,否則編譯錯誤。
?6. 阻止繼承?
使用 sealed 關鍵字禁止其他類繼承:
public sealed class FinalClass { } // 不可被繼承
public class InvalidDerived : FinalClass { } // 編譯錯誤
# ?7. 繼承與多態?
通過繼承實現?運行時多態性?:
Animal animal = new Dog();
animal.Speak(); // 輸出 "Woof!"(實際調用 Dog 類的方法)
?8. 繼承 vs 接口?
?場景? ? | 類繼承?? | ?接口實現? |
---|---|---|
成員類型 ? | 可繼承字段、方法、屬性等具體實現? | 僅定義方法/屬性簽名(無實現) |
復用代碼 ? | 直接復用基類邏輯? | 需重新實現所有接口成員 |
設計目標 ? | 表達 “is-a” 關系(如 Car 是 Vehicle) ? | 表達 “can-do” 能力(如 IDisposable) |
?9. 最佳實踐?
-
避免深度繼承鏈?
超過 3 層的繼承關系通常意味著設計問題,優先使用組合(has-a)而非繼承(is-a)。 -
?里氏替換原則(LSP)?
子類必須能夠完全替代基類,不破壞原有邏輯。 -
?開放封閉原則(OCP)?
通過繼承擴展功能,而非修改基類代碼。
?10. 典型應用場景?
- ?UI控件框架?:Button、TextBox 繼承自 Control 基類
- ?領域模型?:Employee、Manager 繼承自 Person 基類
- ?插件系統?:通過基類定義插件接口,子類實現具體功能
通過合理使用繼承,可以顯著提升代碼的可維護性和擴展性,但需謹慎避免過度設計。