Files
2026-06-21 09:51:55 +08:00

3.8 KiB
Raw Permalink Blame History

密封类

概念: 使用 sealed 关键字修饰的类,叫做==密封类== 作用是:==让这个类不能再被其他类继承==

简单理解: 这个类已经是“最终版本”了,别人只能使用它,不能在它的基础上继续派生子类

通常用法:

  1. 不希望某个类被继续继承,避免子类乱改行为
  2. 类的设计已经完整,不打算给别人扩展
  3. 保护程序规范性和安全性
  4. 表示某个类型在业务上就是终点,不应该再有更细的子类

语法:

sealed class 类名
{

}

案例:

class Enemy
{
	public string Name;

	public virtual void Attack()
	{
		Console.WriteLine("敌人攻击");
	}
}

sealed class Boss : Enemy
{
	public override void Attack()
	{
		Console.WriteLine("Boss发动攻击");
	}
}

上面代码中:

  • Boss 可以继承 Enemy
  • 但是 Bosssealed 修饰后,别的类就不能再继承 Boss

错误示意:

class FinalBoss : Boss
{

}

这样会报错,因为 Boss 是密封类,不能作为父类继续被继承


密封类还能不能正常使用

可以。

sealed 只是不允许别人继承它,==不影响创建对象和调用成员==。

sealed class PlayerConfig
{
	public int MaxHp = 100;

	public void Print()
	{
		Console.WriteLine(MaxHp);
	}
}

PlayerConfig config = new PlayerConfig();
config.Print();

密封类和继承

密封类不是说“自己不能继承别人”,而是说“别人不能继承自己”。

class Animal
{

}

sealed class Dog : Animal
{

}

这个是可以的:

  • Dog 继承了 Animal
  • Dog 自己被密封
  • 所以以后不能再写 class Husky : Dog

和普通类的区别

普通类:

class A
{

}

class B : A
{

}

密封类:

sealed class A
{

}

// class B : A  // 错误,A 不能被继承

一句话: 普通类可以当父类,密封类不能当父类


密封类和抽象类不能同时用

错误写法:

sealed abstract class A
{

}

原因:

  • abstract 抽象类的意义是:必须被子类继承后补全实现
  • sealed 密封类的意义是:不允许被继承

这两个要求互相矛盾,所以不能一起用


顺带理解:sealed 也能修饰重写成员

sealed 不只可以修饰类,还可以修饰==已经 override 的方法或属性==。

作用是: 允许这个类继续被继承,但是不允许子类继续重写某个成员

class Animal
{
	public virtual void Speak()
	{
		Console.WriteLine("动物叫");
	}
}

class Dog : Animal
{
	public sealed override void Speak()
	{
		Console.WriteLine("狗叫");
	}
}

class Husky : Dog
{
	// 这里不能再 override Speak
}

这里要区分:

  1. sealed class Dog:整个 Dog 类不能被继承
  2. sealed override void Speak()Dog 类还能被继承,但 Speak 不能继续被重写

这个内容后面可以和多态vob密封函数一起理解。


注意

  1. sealed 修饰类时,表示这个类==不能被继承==
  2. 密封类自己仍然可以继承普通类,也可以实现接口
  3. 密封类可以正常创建对象、调用方法、访问属性
  4. 密封类不能和 abstract 同时使用
  5. 如果只是想禁止某个方法继续被重写,可以用 sealed override,不一定要把整个类密封
  6. 初学阶段不要滥用 sealed,只有确定“不应该再被继承”时再用

一句话记忆

==sealed class 表示这个类到此为止,后面不能再派生子类。==


引用:

  1. Microsoft Learn: sealed (C# Reference)
  2. Microsoft Learn: Inheritance - derive types to create more specialized behavior

#密封类 #核心