可能重复:
抽象类和静态类有什么区别?
您好
我想知道 C# 中抽象类和静态类之间的所有区别
我什么时候使用什么以及为什么?
抽象类真的是一个我们不能创建它的实例的类吗?
谢谢
我想知道 C# 中抽象类和静态类之间的所有区别。
不要问这样的问题。我可以花几个小时列出数百个差异,但这些差异都与您无关。
C# 中抽象类和静态类之间最重要的区别是什么?
这还差不多。
抽象类通常旨在对类型层次结构中的某些内容进行建模。例如,卡车是一种交通工具,而飞机是一种交通工具,因此您可能有一个基类 Vehicle 和派生类 Truck 和 Airplane。但是“车辆”是抽象的;没有车辆只是车辆而不是某种更具体的东西。你用一个抽象类来表示这个概念。
相比之下,静态类根本不打算对任何东西建模。这只是存储一堆代码的便捷方式。真的,它根本不应该是一堂课;VB 通过将这些东西称为“模块”而不是“类”做出了更好的选择。尽管从技术上讲它们是从对象继承的,但从逻辑上讲,静态类根本不是真正的类型层次结构。它们只是一个存放静态成员的桶。
静态类通常用作扩展方法的容器。
我什么时候使用什么以及为什么?
当您想要构建“X 是一种 Y”形式的模型时,请使用抽象类。就像“汽车是一种交通工具”或“方形是一种形状”或“杂志是一种出版物”,其中“Y”是一个抽象概念。不要将它用于诸如“员工是一种人”之类的事情——人应该是具体的。人不是一个抽象的概念;有些人只是人,但没有车辆不是别的东西。
当您想要创建扩展方法时,或者当您有一堆逻辑上适合但不与任何对象关联的代码时,请使用静态类。例如,如果你有一堆相关的数学例程,那是静态类的一个很好的候选者。
抽象类真的是一个我们不能创建它的实例的类吗?
不,那不是真的。您可以创建抽象类的实例。您可以通过创建更多派生类的实例来实现。
Vehicle v = new Car();
显然 v 指的是 Vehicle 的实例,因此您可以创建抽象类的实例。你不能做的是创建一个抽象类的实例,它不是一个更派生的具体类的实例。
相比之下,您根本无法创建静态类的实例。
这是一个你没有问的问题:
静态类和抽象类的实现关系是什么?
静态类实际上并不作为 CLR 中的概念存在。当你对一个类说“静态”时,我们实际上做的是生成一个没有公共构造函数的抽象密封类。由于它是抽象的,因此您不能直接创建一个。由于它是密封的,因此您无法创建更多派生类并对其进行实例化。
确实不可能创建一个abstract
或static
类的实例,但这就是相似之处的结束。
abstract
不能继承static
abstract
不能有实例static
abstract
类可以实现一个static
类不能实现的接口从根本上说,他们试图服务于两个不同的目的
abstract
类形成一个蓝图/模式,然后以不同且(希望)透明的方式在派生类中实现static
只是可能相关static
方法集合的容器类是必须继承才能使用的abstract
类——它只能被继承。
您可以创建继承它的类的实例。
类static
是根本不能有实例的类;这样的类只有static
成员。
static
类不能被继承,也不能继承其他类。
没错,抽象类不能被实例化,而是形成其他类的基础。好处是您可以将功能放入抽象类以帮助重用。
静态类是由 CLR 在需要时实例化的类。任何时候都只能有一个实例。使用静态类非常有用,但必须注意线程和同时访问。