掌握 C# 抽象类与抽象方法:实战指南
掌握 C# 抽象类与抽象方法
通过清晰示例、继承模式、构造函数与真实用例,探索 C# 抽象类与抽象方法。
抽象类
C# 中抽象类作为模板不可直接实例化。abstract 关键字表明类旨在被子类化。例如:
// 定义抽象类
abstract class Language {
// 字段和方法
}
// 尝试创建实例将报错
// Language obj = new Language();
抽象类可同时包含抽象方法(仅声明无实现)和具体方法(完整实现)。例如:
abstract class Language {
// 抽象方法 – 无方法体
public abstract void Display();
// 具体方法 – 有实现
public void DisplayInfo() {
Console.WriteLine("Concrete method in abstract class");
}
}
继续前请确保熟悉 C# 继承概念。
继承抽象类
因抽象类不可直接实例化,必须创建继承它的具体子类。子类继承抽象类成员,可通过派生对象使用。示例:
using System;
namespace AbstractClassDemo {
abstract class Language {
public void Display() {
Console.WriteLine("Concrete method in abstract class");
}
}
// 具体子类
class Program : Language {
static void Main(string[] args) {
Program prog = new Program();
prog.Display();
Console.ReadLine();
}
}
}
输出
Concrete method in abstract class
Language 为抽象,Program 继承并可调用 Display()。注意抽象类不能为 sealed,必须作为基类型。
注意: 当多个派生类型需实现通用契约时使用此模式。
C# 抽象方法
抽象方法仅声明签名无方法体。强制非抽象派生类提供实现。例如:
public abstract void Display();
仅抽象类可包含抽象方法。具体子类继承时,必须重写所有抽象成员(除非自身也声明为 abstract)。
示例:实现抽象方法
using System;
namespace AbstractClassDemo {
abstract class Animal {
public abstract void MakeSound();
}
class Dog : Animal {
public override void MakeSound() {
Console.WriteLine("Bark Bark");
}
}
class Program {
static void Main(string[] args) {
Dog dog = new Dog();
dog.MakeSound();
Console.ReadLine();
}
}
}
输出
Bark Bark
Animal 声明抽象方法 MakeSound()。具体子类 Dog 提供重写,履行契约。
注意: 抽象方法隐式为 virtual,故不允许也无需 virtual 关键字。
带 Get/Set 的抽象属性
抽象访问器允许派生类为属性 get/set 提供自定义逻辑。示例:
using System;
namespace AbstractClassDemo {
abstract class Animal {
protected string name;
public abstract string Name { get; set; }
}
class Dog : Animal {
public override string Name {
get { return name; }
set { name = value; }
}
}
class Program {
static void Main(string[] args) {
Dog dog = new Dog();
dog.Name = "Tom";
Console.WriteLine("Name: " + dog.Name);
Console.ReadLine();
}
}
}
输出
Name: Tom
派生类实现抽象属性,实现封装状态管理。
抽象类中的构造函数
抽象类可定义构造函数初始化所有子类共享的状态。创建子类实例时,抽象类构造函数先执行。示例:
using System;
namespace AbstractClassDemo {
abstract class Animal {
public Animal() {
Console.WriteLine("Animal Constructor");
}
}
class Dog : Animal {
public Dog() {
Console.WriteLine("Dog Constructor");
}
}
class Program {
static void Main(string[] args) {
Dog d1 = new Dog();
Console.ReadLine();
}
}
}
输出
Animal Constructor Dog Constructor
子类也可定义析构函数用于清理逻辑。
注意: 构造函数适合设置所有派生类型所需的共享资源。
通过抽象类实现 C# 抽象
抽象类提供抽象机制:隐藏实现细节,暴露清晰接口。通过关注“做什么”而非“怎么做”简化复杂系统。
现实类比:摩托车刹车系统。刹车的外部行为——减速或停车——一致,但底层机制因车型而异。抽象类让每个车型实现独特刹车逻辑而不改变外部契约。
示例:摩托车刹车
using System;
namespace AbstractClassDemo {
abstract class MotorBike {
public abstract void Brake();
}
class SportsBike : MotorBike {
public override void Brake() {
Console.WriteLine("Sports Bike Brake");
}
}
class MountainBike : MotorBike {
public override void Brake() {
Console.WriteLine("Mountain Bike Brake");
}
}
class Program {
static void Main(string[] args) {
SportsBike s1 = new SportsBike();
s1.Brake();
MountainBike m1 = new MountainBike();
m1.Brake();
Console.ReadLine();
}
}
}
输出
Sports Bike Brake Mountain Bike Brake
MotorBike 声明抽象方法 Brake()。各具体车类提供特定实现,展示多态性。
注意: 若需完全抽象(无任何基础实现),考虑使用接口。
C语言