C#中的abstract(抽象)修饰词

C#中的abstract(抽象)修饰词学习笔记

AssistedByChatGPT

在C#中,abstract关键字用于创建抽象类和抽象成员。抽象类是一种特殊的类,它不能被实例化,只能作为基类被其他类继承。抽象成员是在类中声明但不提供实现的方法、属性、索引器或事件。在派生类中,必须对基类中的所有抽象成员进行实现(覆盖)。

抽象类

  • 定义:抽象类通过在类定义前加上abstract关键字来创建。抽象类通常用作基类,在这个类中可以包含抽象成员和非抽象成员。
  • 目的:抽象类的主要目的是提供一个通用模板,派生类可以根据这个模板实现具体的功能。
  • 实例化:不能直接创建抽象类的实例。尝试这样做会导致编译时错误。

抽象成员

  • 定义:抽象成员是在抽象类内部声明的,但没有实现的成员。抽象成员也使用abstract关键字进行声明。
  • 实现:在派生类中,必须重写并实现所有继承的抽象成员,除非派生类本身也被声明为抽象类。
  • 类型:可以将方法、属性、索引器和事件声明为抽象。

个人理解

由此,我的个人理解是abstract的主要作用是除了在编程时可以防止手贱实例化以外,由于它强制继承它的派生类需要实现这个这个抽象类或者成员的方法和属性,所以还具有规范化接口的功能。

举个栗子

查老师给的栗子,剥好的香香的,很容易理解 : )

想象我们在开发一个动物园管理系统,需要表示不同类型的动物以及它们的叫声。在这个系统中,每种动物的叫声都是独特的,但我们不能直接实例化一个“动物”因为“动物”是一个非常抽象的概念。在这种情况下,我们可以使用abstract关键字来创建一个抽象的Animal类和一个抽象方法MakeSound。每个具体的动物类(如DogCat)都继承自Animal类,并提供MakeSound方法的具体实现。

抽象类和抽象方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public abstract class Animal
{
    // 抽象方法,没有具体实现
    public abstract void MakeSound();
}

public class Dog : Animal
{
    // 在Dog类中提供MakeSound方法的具体实现
    public override void MakeSound()
    {
        Console.WriteLine("Woof!");
    }
}

public class Cat : Animal
{
    // 在Cat类中提供MakeSound方法的具体实现
    public override void MakeSound()
    {
        Console.WriteLine("Meow!");
    }
}

使用示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class Program
{
    static void Main()
    {
        // Animal animal = new Animal(); // 错误:不能创建抽象类的实例
        Dog dog = new Dog();
        dog.MakeSound(); // 输出:Woof!

        Cat cat = new Cat();
        cat.MakeSound(); // 输出:Meow!

        // 使用Animal类型的引用来指向具体的动物实例
        Animal myDog = new Dog();
        myDog.MakeSound(); // 依然输出:Woof!

        Animal myCat = new Cat();
        myCat.MakeSound(); // 依然输出:Meow!
    }
}

在这个例子中:

  • Animal是一个抽象类,代表了动物园里所有动物的共同特征。它定义了一个抽象方法MakeSound,但没有提供具体的实现,因为每种动物的叫声都是不同的。
  • DogCatAnimal的具体实现,它们分别提供了MakeSound方法的具体实现。这意味着每种动物都有自己特有的叫声。
  • 我们不能直接创建Animal类的实例,因为它是抽象的。但我们可以创建DogCat的实例,并通过Animal类型的引用来调用它们的MakeSound方法,这体现了多态性。
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus