跳到主要内容

C# 密封类和方法

提示
  1. 封闭类的定义和功能:在C#中,封闭类使用 sealed 关键字定义,防止其他类继承它。这样的类不能被其他类继承,确保其方法不会被修改或重写。
  2. 封闭方法的用途:封闭方法是在方法重写中使用 sealed 关键字声明的方法,阻止进一步的重写。这在多层继承中保护了方法的实现,确保其行为不被子类改变。
  3. 封闭类的应用场景:封闭类主要用于防止继承以增强安全性和封装性,特别适用于包含静态成员的类。例如,System.Drawing 命名空间中的 Pens 类是封闭类的一个实例。

封闭类

在 C# 中,当我们不想让一个类被另一个类继承时,我们可以声明这个类为封闭类

封闭类不能有派生类。我们使用 sealed 关键字来创建封闭类。例如,

using System;
namespace SealedClass {
sealed class Animal {

}

// 尝试继承封闭类
// 错误代码
class Dog : Animal {

}

class Program {
static void Main (string [] args) {

// 创建 Dog 类的对象
Dog d1 = new Dog();
Console.ReadLine();
}
}
}

在上面的例子中,我们创建了一个封闭类 Animal。这里,我们尝试从 Animal 类派生 Dog 类。

由于封闭类不能被继承,程序生成以下错误:

error CS0509: 'Dog': cannot derive from sealed type 'Animal'

封闭方法

在方法重写时,如果我们不想让一个被重写的方法被另一个类进一步重写,我们可以将其声明为封闭方法

我们使用 sealed 关键字与被重写的方法一起创建封闭方法。例如,

using System;
namespace SealedClass {

class Animal {
public virtual void makeSound() {
Console.WriteLine("Animal Sound");
}
}

class Dog : Animal {

// 封闭方法
sealed public override void makeSound() {

Console.WriteLine("Dog Sound");
}
}

class Puppy : Dog {

// 尝试重写封闭方法
public override void makeSound() {
Console.WriteLine("Puppy Sound");
}
}

class Program {
static void Main (string [] args) {

// 创建 Puppy 类的对象
Puppy d1 = new Puppy();
Console.ReadLine();
}
}
}

在上面的例子中,我们在 Dog 类内重写了 makeSound() 方法。

// 在 Dog 类内
sealed public override void makeSound() {
Console.WriteLine("Dog Sound");
}

注意我们在 makeSound() 中使用了 sealed 关键字。这意味着继承 Dog 类的 Puppy 类不允许重写 makeSound()

因此,当我们尝试在 Puppy 类中进一步重写 makeSound() 方法时,我们得到一个错误

error CS0239: 'Puppy.makeSound()': cannot override inherited member 'Dog.makeSound()' because it is sealed

注意:封闭一个被重写的方法可以防止在多层继承中的方法重写。

为什么使用封闭类?

  1. 我们使用封闭类来阻止继承。由于不能从封闭类继承,封闭类中的方法不能被其他类操控。

这有助于防止安全问题。例如,

sealed class A {
...
}

// 错误代码
class B : A {
...
}

由于类 A 不能被继承,类 B 不能重写和操控类 A 的方法。

  1. 封闭类的一个最佳用途是当你有一个包含静态成员的类时。

System.Drawing 命名空间中的 Pens 类就是封闭类的一个例子。Pens 类有表示标准颜色的笔的静态成员。Pens.Blue 代表一支蓝色的笔。