跳到主要内容

C# 抽象类和方法

提示
  1. 抽象类的特点:C# 中的抽象类用 abstract 关键字定义,不能直接实例化,包含抽象和非抽象方法。
  2. 继承抽象类:抽象类必须通过子类继承实现,子类需具体实现抽象方法。
  3. 抽象的意义:抽象是面向对象编程的核心,用于隐藏细节,仅展示必要信息,如通过 getset 访问器实现。

抽象类

在 C# 中,我们不能创建抽象类的对象。我们使用 abstract 关键字来创建一个抽象类。例如,

// 创建一个抽象类
abstract class Language {
// 字段和方法
}
...

// 尝试创建 Language 对象
// 抛出错误
Language obj = new Language();

抽象类可以同时拥有抽象方法(没有主体的方法)和非抽象方法(有主体的方法)。例如,

abstract class Language {

// 抽象方法
public abstract void display1();

// 非抽象方法
public void display2() {
Console.WriteLine("非抽象方法");
}
}

在继续之前,确保了解 C# 继承 的相关知识。

继承抽象类

由于我们不能创建抽象类的对象,我们必须从它派生出一个子类。这样我们就可以使用派生类的对象来访问抽象类的成员。例如,

using System;
namespace AbstractClass {

abstract class Language {

// 非抽象方法
public void display() {
Console.WriteLine("非抽象方法");
}
}

// 继承自抽象类
class Program : Language {

static void Main (string [] args) {

// Program 类的对象
Program obj = new Program();

// 访问抽象类的方法
obj.display();

Console.ReadLine();
}
}
}

输出

非抽象方法

在上面的示例中,我们创建了一个名为 Language 的抽象类。该类包含一个非抽象方法 display()

我们创建了继承抽象类的 Program 类。注意这个语句,

obj.display();

这里,obj 是派生类 Program 的对象。我们正在使用对象 obj 调用抽象类的方法。

注意:我们只能将抽象类用作基类。这就是为什么抽象类不能被密封。要了解更多,请访问 C# 密封类与方法

C# 抽象方法

没有主体的方法被称为抽象方法。我们使用 abstract 关键字来创建抽象方法。例如,

public abstract void display();

这里,display() 是一个抽象方法。抽象方法只能存在于抽象类中。

当一个非抽象类继承了一个抽象类时,它应该提供抽象方法的实现。

示例:抽象方法的实现

using System;
namespace AbstractClass {

abstract class Animal {

// 抽象方法
public abstract void makeSound();
}

// 继承自抽象类
class Dog : Animal {

// 提供抽象方法的实现
public override void makeSound() {

Console.WriteLine("汪汪");

}
}
class Program {
static void Main (string [] args) {
// 创建 Dog 类的对象
Dog obj = new Dog();
obj.makeSound();

Console.ReadLine();
}
}
}

输出

Bark Bark

在上面的例子中,我们创建了一个名为 Animal 的抽象类。类内有一个抽象方法 makeSound()

我们有一个从 Animal 类继承而来的 Dog 类。Dog 类提供了抽象方法 makeSound() 的实现。

// 提供抽象方法的实现
public override void makeSound() {

Console.WriteLine("Bark Bark");

}

注意,我们在 makeSound() 方法中使用了 override。这表示该方法重写了基类中的方法。

然后我们使用 Dog 类的对象来访问 makeSound()

如果 Dog 类没有提供抽象方法 makeSound() 的实现,那么 Dog 类也应该被标记为抽象的。

注意:与 C# 的继承不同,我们不能在基类的抽象方法中使用 virtual。这是因为抽象类隐含地是虚拟的。

含有 get 和 set 访问器的抽象类

我们可以将 get 和 set 访问器标记为抽象的。例如,

using System;
namespace AbstractClass {
abstract class Animal {

protected string name;
// 抽象方法
public abstract string Name {
get;
set;
}
}

// 继承自抽象类
class Dog : Animal {

// 提供抽象方法的实现
public override string Name {
get {
return name;
}
set {
name = value;
}
}

}
class Program {
static void Main (string [] args) {
// 创建 Dog 类的对象
Dog obj = new Dog();
obj.Name = "Tom";
Console.WriteLine("Name: " + obj.Name);

Console.ReadLine();
}
}
}

输出

Name: Tom

在上面的例子中,我们将 get 和 set 访问器标记为了抽象的。

obj.Name = "Tom";
Console.WriteLine("Name: " + obj.Name);

我们使用派生类 Dog 的对象来设置和获取抽象类 Animalname 字段的值。

访问抽象类的构造函数

抽象类也可以有构造函数。例如,

using System;
namespace AbstractClass {
abstract class Animal {

public Animal() {
Console.WriteLine("Animal Constructor");
}
}

class Dog : Animal {
public Dog() {
Console.WriteLine("Dog Constructor");
}
}

class Program {
static void Main (string [] args) {
// 创建 Dog 类的对象
Dog d1 = new Dog();

Console.ReadLine();
}
}
}

输出

Animal Constructor
Dog Constructor

在上述示例中,我们在抽象类 Animal 内创建了一个构造函数。

Dog d1 = new Dog();

这里,当我们创建派生类 Dog 的对象时,抽象类 Animal 的构造函数也会被调用。

注意:我们也可以在抽象类中使用析构函数。

C# 抽象

抽象类用于实现 C# 中的抽象。

抽象是面向对象编程中的一个重要概念。它允许我们隐藏不必要的细节,只显示需要的信息。

这有助于我们通过隐藏细节,用一个更简单、更高级的概念来管理复杂性。

抽象的一个实际例子可以是摩托车的刹车。我们知道刹车是做什么的。当我们施加刹车时,摩托车将会停下。然而,刹车的工作原理对我们来说是隐藏的。

隐藏刹车的工作原理的主要优势是,现在制造商可以为不同的摩托车以不同的方式实现刹车。然而,刹车的功能将是相同的。

示例:C# 抽象

using System;
namespace AbstractClass {
abstract class MotorBike {

public abstract void brake();
}

class SportsBike : MotorBike {

// 提供抽象方法的实现
public override void brake() {
Console.WriteLine("Sports Bike Brake");
}

}

class MountainBike : MotorBike {

// 提供抽象方法的实现
public override void brake() {
Console.WriteLine("Mountain Bike Brake");
}

}
class Program {
static void Main (string [] args) {
// 创建 SportsBike 类的对象
SportsBike s1 = new SportsBike();
s1.brake();

// 创建 MountainBike 类的对象
MountainBike m1 = new MountainBike();
m1.brake();

Console.ReadLine();
}
}
}

输出

Sports Bike Brake
Mountain Bike Brake

在上述示例中,我们创建了一个抽象类 MotorBike。它有一个抽象方法 brake()

由于 brake() 是一个抽象方法,所以 MotorBikebrake() 的实现是隐藏的。

每种摩托车都有不同的刹车实现方式。这就是为什么 SportsBike 有自己的 brake() 实现,而 MountainBike 也有自己的 brake() 实现。

注意:我们使用接口来实现 C# 中的完全抽象。要了解更多,请访问 C# 接口