一篇文章搞懂C#中的抽象
1.1.1. 什么是抽象?
抽象是指隐藏细节,突出核心功能,使程序员专注于对象的主要功能。具体来说,抽象是将复杂系统的某些特性和行为提取出来,简化系统的设计和使用。
我们还是以电视遥控器为例来说明,
(1) 内部细节:电路板、红外线发射器等。
(2) 核心功能:打开电视、调节音量、换频道等。
但你只需按下按钮,电视就会执行相应的操作,而不需要了解遥控器内部的工作原理。这就是抽象,隐藏复杂的内部细节,突出简单的使用功能。
1.1.2. 实现抽象的两种方法
(1) 抽象类:不能实例化,可以包含抽象方法(没有实现的方法)和具体方法(有实现的方法)。
(2) 接口:定义一组方法和属性,没有实现,类可以实现多个接口。
1.1.3. 抽象类
抽象类使用 abstract 关键字定义。抽象类中可以包含抽象方法和具体方法。
abstract class Animal
{
// 抽象方法(没有方法体)
public abstract void MakeSound();
// 具体方法
public void Sleep()
{
Console.WriteLine("Sleeping...");
}
}
?
class Dog : Animal
{
// 实现抽象方法
public override void MakeSound()
{
Console.WriteLine("Bark");
}
}
?
class Program
{
static void Main()
{
Dog dog = new Dog();
dog.MakeSound(); // 输出:Bark
dog.Sleep(); // 输出:Sleeping...
}
}
1.1.4. 抽象类的特点
特点 | 解释 |
不能实例化 | 不能创建抽象类的对象。 |
可以包含具体方法 | 抽象类可以包含具体方法(有实现的方法)。 |
可以包含抽象方法 | 抽象类可以包含抽象方法(没有实现的方法)。 |
需要被继承 | 必须由子类继承并实现其抽象方法。 |
1.1.5. 接口
接口使用 interface 关键字定义,接口中只包含方法和属性的声明,没有实现。
interface IAnimal
{
void MakeSound();
}
?
class Cat : IAnimal
{
// 实现接口方法
public void MakeSound()
{
Console.WriteLine("Meow");
}
}
?
class Program
{
static void Main()
{
IAnimal cat = new Cat();
cat.MakeSound(); // 输出:Meow
}
}
1.1.6. 接口的特点
特点 | 解释 |
不能实例化 | 不能创建接口的对象。 |
没有实现 | 接口中的方法和属性没有实现。 |
需要被实现 | 必须由类实现接口中的所有方法和属性。 |
多重继承 | 一个类可以实现多个接口。 |
1.1.7. 抽象类 vs 接口
特点 | 抽象类 | 接口 |
实现 | 可以包含具体实现 | 不能包含具体实现 |
多重继承 | 不能多重继承 | 可以实现多个接口 |
字段 | 可以包含字段 | 不能包含字段 |
访问修饰符 | 可以使用访问修饰符 | 默认是 public,不能使用访问修饰符 |
1.1.8. 什么时候使用抽象类和接口?
使用抽象类:
(1) 当你需要为一组相关对象提供通用的基类,并包含一些共有的实现细节。
(2) 当你有一些方法需要在基类中实现,并且其他方法需要在派生类中实现。
使用接口:
(1) 当你需要为不相关的类提供一些通用行为。
(2) 当你需要实现多重继承时,因为C#不支持类的多重继承,但支持接口的多重实现。
1.1.9. 示例对比
1.1.9.1. 抽象类示例
abstract class Shape
{
public abstract double GetArea();
}
?
class Circle : Shape
{
private double radius;
?
public Circle(double radius)
{
this.radius = radius;
}
?
public override double GetArea()
{
return Math.PI * radius * radius;
}
}
?
class Program
{
static void Main()
{
Shape circle = new Circle(5);
Console.WriteLine(#34;Area of circle: {circle.GetArea()}");
}
}
1.1.9.2. 接口示例
interface IDrawable
{
void Draw();
}
?
class Square : IDrawable
{
public void Draw()
{
Console.WriteLine("Drawing a square");
}
}
?
class Program
{
static void Main()
{
IDrawable square = new Square();
square.Draw();
}
}
1.1.10. 总结
抽象通过隐藏对象的复杂性,只显示必要的功能,使程序员专注于对象的主要功能,忽略内部实现细节。C#通过抽象类和接口实现抽象,允许开发者创建灵活、易维护的代码。理解抽象类和接口的使用场景,是掌握C#面向对象编程的重要一步。