C# Abstract 抽象类、抽象方法 温故而知新

在C#中,abstract 关键字用于定义抽象类和抽象方法。它是面向对象编程中的重要概念,允许你为子类提供基本框架,而不需要在基类中实现所有的功能。我们来具体看看如何使用 abstract 关键字。

1. 抽象类 (abstract class)

  • 抽象类是不能被实例化的类,必须被继承。
  • 它可以包含已实现的方法(非抽象方法)和未实现的方法(抽象方法)。
  • 抽象类通常用于提供通用行为的基本框架,子类继承后可以实现具体行为。
抽象类示例:
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(string[] args)
    {
        Dog dog = new Dog();
        dog.MakeSound();  // 输出:Bark
        dog.Sleep();  // 输出:Sleeping...
    }
}

在这个例子中,Animal 是一个抽象类,定义了一个抽象方法 MakeSound(),该方法没有实现。具体的子类 Dog 继承了 Animal 并实现了 MakeSound() 方法。

2. 抽象方法 (abstract method)

  • 抽象方法只能在抽象类中声明,不能有方法体(即没有具体实现)。
  • 子类继承抽象类后,必须实现所有的抽象方法。
  • 抽象方法使用 override 关键字在子类中实现。
抽象方法示例:
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(string[] args)
    {
        Shape shape = new Circle(5.0);
        Console.WriteLine($"Area of the circle: {shape.GetArea()}");
    }
}

在这个例子中,Shape 是一个抽象类,定义了抽象方法 GetArea()Circle 类继承了 Shape 并实现了 GetArea() 方法,返回圆的面积。

     抽象类和接口的区别:

  • 抽象类可以包含已实现的方法,而接口中的所有方法都必须是未实现的(直到C# 8.0引入了默认接口方法)。
  • 抽象类可以包含字段和构造函数,而接口不能。
  • 一个类只能继承一个抽象类,但可以实现多个接口。

abstract 关键字帮助你在设计类时构建可扩展、灵活的体系结构。理解如何使用它可以帮助你在面向对象编程中设计出更好的结构。

通俗讲

1. 抽象类的作用:

抽象类可以看作是为一组相似的事物(类)提供一个"模板"或"蓝图"。我们通过定义一个抽象类,提炼出这些相似事物共有的属性和行为,但我们并不直接使用这个模板。具体的事物(子类)会基于这个模板来实现它们自己的细节。

在开发中,抽象类帮助我们定义了一种"通用模板",让代码更简洁、更有条理。我们不需要为每个动物单独定义"睡觉"的方法,只需要在抽象类里定义一次,而每个动物只需专注于实现自己的特定行为(如叫声)。

2. 抽象方法的作用:

抽象方法就像是"合同"或"约定"。它告诉继承这个抽象类的子类:“你必须实现这个方法,但我不关心你是怎么实现的。”

作用:
  • 强制子类实现某些行为:抽象方法不能有具体实现,子类必须给出它们自己的实现,这样就确保了所有子类都有该方法的实现。就像上面的 MakeSound(),每个动物必须有自己的叫声。
  • 灵活性:抽象方法允许每个子类以不同的方式实现相同的功能。比如,虽然每个动物都会发出声音,但它们发出的声音是不一样的。

为什么使用抽象类和抽象方法?

  1. 代码复用:抽象类中的普通方法可以被多个子类共享,避免重复编写相同的代码。
  2. 强制行为一致性:通过抽象方法,确保所有子类都有某些关键的行为。
  3. 灵活扩展:未来你如果增加新的动物种类,只需继承抽象类并实现抽象方法,而无需修改原有的代码。这样使代码更具扩展性和可维护性。
举个生活中的例子:

假设你有一个智能设备(比如手机),无论是安卓还是苹果设备,它们都有类似的功能,如开机关机打电话等。这些功能可以看作是抽象类中的普通方法。而不同品牌的手机操作系统不一样,它们的具体实现细节也不同,这就是抽象方法的作用。抽象类提供了基本框架,而具体的手机实现了自己的开机和关机方式。

总结来说,抽象类提供了一个基础模板,抽象方法则是强制子类去实现的功能。它们让代码结构更清晰,减少重复工作,增加扩展的灵活性,是编写可维护代码的好工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值