抽象类在C#中的地位有些特殊——它不能直接实例化,只允许被继承。换句话说,只要一个类里出现了abstract标识的方法,这个类就必须声明为abstract class,否则编译器会直接报错。这可不是什么小细节,而是整个抽象机制的设计起点。

先搞清楚一个基本规则:abstract class是不能用new来创建实例的。想试试new Animal()?编译器会直接甩你一脸CS0144:“无法创建抽象类的实例”。抽象类存在唯一的意义,就是作为基类被继承。它允许你定义一部分可复用的逻辑(比如Sleep()),同时强制子类实现关键行为(比如MakeSound())。

具体来说,抽象类有几个值得注意的特性:

抽象方法:只有契约,没有实现

抽象方法的声明形式是public abstract void Run();,结尾是分号,没有{}。它不提供任何实现,只划出契约边界。一旦父类中存在这样的方法,所有非抽象子类都必须用override显式实现它。

这里有几点必须注意:

什么时候选抽象类,什么时候选接口

这是个经典问题。当你要共享代码实现、需要字段或构造逻辑、或者想约束继承链深度(只能单继承)时,优先考虑抽象类。举个例子,所有Shape都要记录CreatedTime字段,都有默认的ToString()实现,但面积计算必须由子类决定——这种场景抽象类再合适不过。

对比来看:

一个容易被忽略的细节:抽象类可以没有抽象方法

很多人在这里卡壳。比如abstract class Logger完全可以不写任何abstract方法,只提供通用日志格式化逻辑,并用abstract修饰自身来防止被误实例化。编译器只检查“有没有abstract成员”来决定是否强制子类实现,不检查“有没有abstract方法”。

还有几点补充:

C#怎么使用抽象类abstract_C#抽象类和抽象方法教程【进阶】

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