发布于2026-07-20 阅读(0)
扫一扫,手机访问
先搞清楚一个核心事实:abstract 类不能直接 new 实例。这是最常踩的坑——编译器会立刻报错 Cannot create an instance of the abstract class or interface。它不是“高级版普通类”,而是设计用来被继承的契约骨架。
abstract 类?因为 abstract 类里可能有没实现的成员,比如 abstract 方法或属性。C# 要求所有非抽象子类必须补全这些空缺,否则连编译都过不去。
abstract 方法,整个类自动变成 abstract,且不可实例化abstract 类可以有构造函数,但只能被子类的 : base(...) 调用,不能手动 newnew MyBaseClass() 会触发编译错误,不是运行时异常abstract 方法必须用 override 实现子类实现抽象成员时,必须显式加 override,不能只写方法签名。漏掉 override 会导致编译失败,提示 No suitable method found to override 或 Member must ha ve 'override' keyword。
public abstract int Area();public override int Area() { ... },访问修饰符不能比父类更严格(如父类 public,子类不能写 protected)static、virtual 或 sealed —— 编译器直接拒绝abstract 类混用时的常见陷阱当一个 abstract 类实现接口(如 IComparable),它可以不提供接口方法的具体实现,而是把责任推给子类——只要把接口方法也声明为 abstract 即可。
abstract class Shape : IComparable { public abstract int CompareTo(object obj); }CompareTo,就同时满足接口契约和抽象类约束abstract 转发过去;否则编译报错 'X' does not implement interface member 'Y'abstract 和 sealed 放在一起这两个关键字语义冲突,C# 禁止同时使用。试图写 sealed abstract class C 会得到编译错误 error CS0418: 'C': an abstract class cannot be sealed or static。
abstract 的核心诉求是“必须被继承”,sealed 的核心诉求是“禁止被继承”sealed,而不是污染抽象基类virtual,所以子类能 override;不需要、也不允许显式加 virtual真正难的不是语法,而是判断哪些逻辑该放进抽象层、哪些留给子类决定。比如 Draw() 可以是抽象的,但通用日志记录或参数校验往往适合放在抽象类的非抽象方法里——这部分容易被忽略,结果导致重复代码或行为不一致。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8