抽象类
抽象类就是"半成品模板",它规定了一些必须要做的事情(抽象方法),也提供了一些现成的东西(普通方法)。
————————————————————————————————————————————————————————————————————————————
案例1:动物(强制子类实现叫声)
csharp
abstract class Animal
{
public abstract void Speak(); // 抽象方法:只声明,不实现
public void Sleep() // 普通方法:所有动物共用
{
Console.WriteLine("睡觉中...");
}
}
class Dog : Animal
{
public override void Speak() // 必须实现
{
Console.WriteLine("汪汪");
}
}
class Program
{
static void Main()
{
Dog d = new Dog();
d.Speak(); // 汪汪
d.Sleep(); // 睡觉中...
// Animal a = new Animal(); // 报错!抽象类不能实例化
}
}
Speak必须由子类自己实现,但Sleep所有动物直接用。
——————————————————————————————————————————————————————————————————————————————————
案例2:交通工具(计算时间)
csharp
abstract class Vehicle
{
public abstract double GetSpeed(); // 速度由子类定
public double CalcTime(double distance) // 通用公式
{
return distance / GetSpeed();
}
}
class Car : Vehicle
{
public override double GetSpeed() { return 60; }
}
class Bike : Vehicle
{
public override double GetSpeed() { return 15; }
}
class Program
{
static void Main()
{
Car c = new Car();
Bike b = new Bike();
Console.WriteLine(c.CalcTime(120)); // 2小时
Console.WriteLine(b.CalcTime(120)); // 8小时
}
}
计算时间的逻辑写在父类,子类只需提供各自的速度就行。
——————————————————————————————————————————————————————————————————————————————————
案例3:员工(必须发工资,但算法不同)
csharp
abstract class Employee
{
public abstract int GetSalary(); // 必须实现,但算法不同
public void ShowPay() // 通用方法
{
Console.WriteLine($"本月工资:{GetSalary()}元");
}
}
class FullTime : Employee
{
public override int GetSalary() { return 8000; }
}
class PartTime : Employee
{
private int hours = 80;
public override int GetSalary() { return hours * 50; }
}
class Program
{
static void Main()
{
FullTime f = new FullTime();
PartTime p = new PartTime();
f.ShowPay(); // 本月工资:8000元
p.ShowPay(); // 本月工资:4000元
}
}
GetSalary必须由子类实现(月薪和时薪算法不同),但ShowPay直接复用。

浙公网安备 33010602011771号