-
抽象类(Abstract Class):部分实现
抽象类(Abstract Class):部分实现
-
抽象类的核心定义
抽象类是一种不能实例化的类,用于定义基类的通用行为vb.net教程C#教程python教程SQL教程access 2010教程和规范子类的必须实现的行为。它结合了:
具体方法:子类可直接复用的通用逻辑;
抽象方法:子类必须实现的个性化逻辑(无方法体)。
核心价值:
代码复用:共享通用逻辑(如动物的睡觉行为);
行为规范:强制子类实现特定行为(如动物的发声方式);
层次结构:构建类的继承树(如Animal→Dog→Poodle)。
语法规则:
用abstract关键字修饰类;
抽象方法用abstract修饰,无方法体;
子类必须实现所有抽象方法(否则子类也需为抽象类)。 -
实例:动物抽象类的实现
以动物行为为例,定义抽象基类Animal,包含通用属性(名字)、具体方法(睡觉)和抽象方法(发声、移动),再让Dog、Bird子类实现抽象方法。
2.1 完整代码实现
csharp
using System;
// 1. 抽象基类:Animal
public abstract class Animal
{
// 通用属性:名字
public string Name { get; set; }
// 构造函数:初始化名字
public Animal(string name)
{
Name = name;
}
// 抽象方法:发声(子类必须实现)
public abstract void MakeSound();
// 抽象方法:移动(子类必须实现)
public abstract void Move();
// 具体方法:睡觉(子类可直接复用)
public void Sleep()
{
Console.WriteLine($"{Name}正在睡觉...");
}
}
// 2. 子类:Dog(继承Animal)
public class Dog : Animal
{
// 调用父类构造函数
public Dog(string name) : base(name) { }
// 实现抽象方法:发声
public override void MakeSound()
{
Console.WriteLine($"{Name}汪汪叫!");
}
// 实现抽象方法:移动
public override void Move()
{
Console.WriteLine($"{Name}用四条腿跑!");
}
}
// 3. 子类:Bird(继承Animal)
public class Bird : Animal
{
public Bird(string name) : base(name) { }
public override void MakeSound()
{
Console.WriteLine($"{Name}叽叽喳喳叫!");
}
public override void Move()
{
Console.WriteLine($"{Name}扇动翅膀飞!");
}
}
// 4. 测试类
class Program
{
static void Main()
{
// 抽象类不能实例化:Animal animal = new Animal("动物"); // 编译错误
Animal dog = new Dog("旺财");
Animal bird = new Bird("小麻雀");
dog.MakeSound(); // 调用Dog的实现
dog.Move(); // 调用Dog的实现
dog.Sleep(); // 调用父类的具体方法
bird.MakeSound();// 调用Bird的实现
bird.Move(); // 调用Bird的实现
bird.Sleep(); // 调用父类的具体方法
}
}
2.2 逐行代码讲解
抽象类Animal:
oabstract class Animal:标记为抽象类,不能实例化;
opublic abstract void MakeSound():抽象方法,无方法体,子类必须实现;
opublic void Sleep():具体方法,有完整实现,子类可直接调用。
子类Dog:
oclass Dog : Animal:继承抽象类,必须实现所有抽象方法;
obase(name):调用父类构造函数初始化Name属性;
ooverride void MakeSound():用override关键字实现抽象方法。
测试逻辑:
oAnimal dog = new Dog("旺财"):父类引用指向子类实例(多态特性);
odog.MakeSound():执行子类Dog的实现;
odog.Sleep():执行父类Animal的具体方法。
输出结果:
旺财汪汪叫!
旺财用四条腿跑!
旺财正在睡觉...
小麻雀叽叽喳喳叫!
小麻雀扇动翅膀飞!
小麻雀正在睡觉...
-
基础知识拓展
3.1 抽象类vs接口:核心区别
| 特性 | 抽象类(Abstract Class) | 接口(Interface) |
|---|---|---|
| 继承限制 | 子类只能继承一个抽象类 | 子类可实现多个接口 |
| 成员类型 | 可包含字段、属性、构造函数、具体方法、抽象方法 | 仅包含方法、属性、事件、索引器(无字段/构造) |
| 实现方式 | 子类需实现所有抽象方法(否则子类为抽象类) | 子类需实现所有接口成员 |
| 核心用途 | 共享通用逻辑+规范行为(How to do + What to do) | 仅规范行为(What to do) |
| 实例化 | 不能实例化 | 不能实例化 |
3.2 抽象方法vs虚方法
| 特性 | 抽象方法(Abstract Method) | 虚方法(Virtual Method) |
|---|---|---|
| 方法体 | 无方法体 | 有方法体(默认实现) |
| 类要求 | 只能在抽象类中定义 | 可在普通类/抽象类中定义 |
| 子类处理 | 必须重写(override) | 可选重写(override)或隐藏(new) |
3.3 抽象类的使用场景
共享通用逻辑:当多个子类有共同的代码(如Sleep()),可放在抽象类中;
规范子类行为:当子类必须实现特定行为(如MakeSound()),用抽象方法强制;
构建继承层次:当需要定义类的层次结构(如Animal→Mammal→Dog),抽象类是中间层。
3.4 抽象类的构造函数
抽象类可以有构造函数,用于初始化基类的字段/属性;
子类必须通过base()调用父类构造函数;
抽象类的构造函数不能直接调用(因不能实例化)。
4. 总结
抽象类是C#中代码复用与行为规范的结合体:
核心作用:定义基类通用逻辑,强制子类实现个性化行为;
关键语法:abstract修饰类/方法,子类用override实现抽象方法;
使用场景:适合有共同逻辑且需要规范子类行为的场景(如动物、形状、交通工具)。
练习
实现抽象类Shape,包含抽象方法CalculateArea()和CalculatePerimeter(),然后子类Circle和Rectangle实现这些方法。
提示:
Circle需属性Radius;
Rectangle需属性Width和Height;
面积公式:圆=πr²,矩形=宽×高;
周长公式:圆=2πr,矩形=2×(宽+高)。
示例代码框架:
csharp
public abstract class Shape
{
public abstract double CalculateArea();
public abstract double CalculatePerimeter();
}
public class Circle : Shape
{
public double Radius { get; set; }
public Circle(double radius) { Radius = radius; }
// 实现抽象方法...
}
// Rectangle类同理...
本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49370.html










