目录
在C#编程当中,抽象类和抽象方法是面向对象编程的核心概念,它们用于设计负载的系统,并且在代码中实现高效的抽象和继承
抽象类
定义
抽象类是一种不能被实例化的类,用作其他类的基类。它可以包含抽象方法和普通方法,抽象方法是没有实现的方法,需要在派生类中实现。抽象类通常用来定义一种通用的接口或基础行为,为派生类提供共享的功能和结构。
- 抽象类的存在只有一个目的,就是被继承。用作其他类的基类。用abstract修饰
- 抽象类是一种不能被实例化的类,即为不能通过new关键字来创建对象。
- 抽象类可以包含抽象方法和普通方法,以及它们的任意组合
- 抽象类的抽象成员在派生类当中需要override关键字实现
- 抽象类通常用来定义一种通用的接口或者基础行为,为派生类提供共享的功能和结构
抽象类的特点
- 抽象类不能实例化
- 抽象类可以包含字段、属性、方法、构造函数
- 可以在抽象类中定义非抽象方法(即具有具体实现的方法),这些方法可以被派生类继承和使用
- 抽象类可以包含抽象方法,这些方法没有实现,需要由派生类提供具体实现
示例
using System;
abstract class Animal
{
public abstract void MakeSound(); // 抽象方法,派生类需要实现
public void Sleep() // 普通方法,派生类可以继承和使用
{
Console.WriteLine("睡觉!");
}
}
class Dog : Animal
{
public override void MakeSound() // 实现抽象方法
{
Console.WriteLine("狗叫");
}
}
class Program
{
static void Main()
{
Dog myDog = new Dog();
myDog.MakeSound();
myDog.Sleep();
}
}
使用场景
- 当需要定义一个基础类,它包含某些通用的功能和结构,但不希望它被直接实例化时。
- 当需要在多个派生类中共享一些通用实现时。
- 当有一组派生类共享某些方法和属性时,使用抽象类可以减少代码重复。
抽象方法
定义
抽象方法是没有实现的方法,只能存在于抽象类中。抽象方法定义了派生类需要实现的方法签名,但不提供具体的实现。它迫使所有派生类都提供自己对这个方法的实现
抽象方法的特点
- 抽象方法只能在抽象类中声明。
- 抽象方法没有方法体,只有方法签名。
- 派生类必须重写(override)所有抽象方法,除非派生类也是抽象类。
- 通过抽象方法可以确保派生类遵循相同的接口规范。
示例
using System;
abstract class Animal
{
public abstract void MakeSound(); // 抽象方法,派生类需要实现
public abstract void Eat(); // 新增的抽象方法,派生类也需要实现
public void Sleep() // 普通方法,派生类可以继承和使用
{
Console.WriteLine("睡觉!");
}
}
class Dog : Animal
{
public override void MakeSound() // 实现抽象方法 MakeSound
{
Console.WriteLine("狗叫");
}
public override void Eat() // 实现抽象方法 Eat
{
Console.WriteLine("狗在吃骨头");
}
}
class Program
{
static void Main()
{
Dog myDog = new Dog();
myDog.MakeSound();
myDog.Eat();
myDog.Sleep();
}
}
使用场景
- 当需要在派生类中提供特定的实现时,定义抽象方法确保所有派生类都遵循相同的接口规范。
- 当某些方法在基类中没有实现,但在所有派生类中必须实现时。
密闭类
定义
有时我们可能不希望一个类被其他类继承。在 C# 中,我们可以使用sealed 关键字来实现这一点,创建一个不能被继承的密闭类。
密闭类的特点
- 当一个类代表一个最终的、不可变的概念时。
- 当你想要避免类的继承带来的复杂性或潜在的错误时。
- 当你想要确保类的实现不会被修改或扩展时。