3.8 KiB
3.8 KiB
密封类
概念:
使用 sealed 关键字修饰的类,叫做==密封类==
作用是:==让这个类不能再被其他类继承==
简单理解: 这个类已经是“最终版本”了,别人只能使用它,不能在它的基础上继续派生子类
通常用法:
- 不希望某个类被继续继承,避免子类乱改行为
- 类的设计已经完整,不打算给别人扩展
- 保护程序规范性和安全性
- 表示某个类型在业务上就是终点,不应该再有更细的子类
语法:
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- 但是
Boss被sealed修饰后,别的类就不能再继承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继承了AnimalDog自己被密封- 所以以后不能再写
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
}
这里要区分:
sealed class Dog:整个Dog类不能被继承sealed override void Speak():Dog类还能被继承,但Speak不能继续被重写
注意
sealed修饰类时,表示这个类==不能被继承==- 密封类自己仍然可以继承普通类,也可以实现接口
- 密封类可以正常创建对象、调用方法、访问属性
- 密封类不能和
abstract同时使用 - 如果只是想禁止某个方法继续被重写,可以用
sealed override,不一定要把整个类密封 - 初学阶段不要滥用
sealed,只有确定“不应该再被继承”时再用
一句话记忆
==sealed class 表示这个类到此为止,后面不能再派生子类。==
引用:
- Microsoft Learn: sealed (C# Reference)
- Microsoft Learn: Inheritance - derive types to create more specialized behavior
#密封类 #核心