商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > c#如何使用abstract类_c#abstract类看这一篇就够了_保姆级教程

c#如何使用abstract类_c#abstract类看这一篇就够了_保姆级教程

  发布于2026-07-20 阅读(0)

扫一扫,手机访问

先搞清楚一个核心事实:abstract 类不能直接 new 实例。这是最常踩的坑——编译器会立刻报错 Cannot create an instance of the abstract class or interface。它不是“高级版普通类”,而是设计用来被继承的契约骨架。

为什么 new 不了 abstract 类?

因为 abstract 类里可能有没实现的成员,比如 abstract 方法或属性。C# 要求所有非抽象子类必须补全这些空缺,否则连编译都过不去。

  • 哪怕类里只有一个 abstract 方法,整个类自动变成 abstract,且不可实例化
  • abstract 类可以有构造函数,但只能被子类的 : base(...) 调用,不能手动 new
  • 误写 new MyBaseClass() 会触发编译错误,不是运行时异常

abstract 方法必须用 override 实现

子类实现抽象成员时,必须显式加 override,不能只写方法签名。漏掉 override 会导致编译失败,提示 No suitable method found to overrideMember must ha ve 'override' keyword

  • 抽象方法声明末尾是分号,没有大括号:public abstract int Area();
  • 子类实现必须带 public override int Area() { ... },访问修饰符不能比父类更严格(如父类 public,子类不能写 protected
  • 不能在抽象方法上加 staticvirtualsealed —— 编译器直接拒绝

接口和 abstract 类混用时的常见陷阱

当一个 abstract 类实现接口(如 IComparable),它可以不提供接口方法的具体实现,而是把责任推给子类——只要把接口方法也声明为 abstract 即可。

  • 例如:abstract class Shape : IComparable { public abstract int CompareTo(object obj); }
  • 这样子类只需实现一次 CompareTo,就同时满足接口契约和抽象类约束
  • 但如果子类忘了实现,错误信息可能指向接口而非抽象类,容易误判源头
  • 注意:抽象类必须“声明”所有接口成员,哪怕只是用 abstract 转发过去;否则编译报错 'X' does not implement interface member 'Y'

别把 abstractsealed 放在一起

这两个关键字语义冲突,C# 禁止同时使用。试图写 sealed abstract class C 会得到编译错误 error CS0418: 'C': an abstract class cannot be sealed or static

  • abstract 的核心诉求是“必须被继承”,sealed 的核心诉求是“禁止被继承”
  • 如果想阻止进一步派生,应该让子类用 sealed,而不是污染抽象基类
  • 抽象类里的方法默认是隐式 virtual,所以子类能 override;不需要、也不允许显式加 virtual

真正难的不是语法,而是判断哪些逻辑该放进抽象层、哪些留给子类决定。比如 Draw() 可以是抽象的,但通用日志记录或参数校验往往适合放在抽象类的非抽象方法里——这部分容易被忽略,结果导致重复代码或行为不一致。

本文转载于:https://www.php.cn/faq/2325140.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注