13

可能重复:
抽象类和静态类有什么区别?

您好
我想知道 C# 中抽象类和静态类之间的所有区别
我什么时候使用什么以及为什么?

抽象类真的是一个我们不能创建它的实例的类吗?
谢谢

4

4 回答 4

66

我想知道 C# 中抽象类和静态类之间的所有区别。

不要问这样的问题。我可以花几个小时列出数百个差异,但这些差异都与您无关。

C# 中抽象类和静态类之间最重要的区别是什么?

这还差不多。

抽象类通常旨在对类型层次结构中的某些内容进行建模。例如,卡车是一种交通工具,而飞机是一种交通工具,因此您可能有一个基类 Vehicle 和派生类 Truck 和 Airplane。但是“车辆”是抽象的;没有车辆只是车辆而不是某种更具体的东西。你用一个抽象类来表示这个概念。

相比之下,静态类根本不打算对任何东西建模。这只是存储一堆代码的便捷方式。真的,它根本不应该是一堂课;VB 通过将这些东西称为“模块”而不是“类”做出了更好的选择。尽管从技术上讲它们是从对象继承的,但从逻辑上讲,静态类根本不是真正的类型层次结构。它们只是一个存放静态成员的桶。

静态类通常用作扩展方法的容器。

我什么时候使用什么以及为什么?

当您想要构建“X 是一种 Y”形式的模型时,请使用抽象类。就像“汽车是一种交通工具”或“方形是一种形状”或“杂志是一种出版物”,其中“Y”是一个抽象概念。不要将它用于诸如“员工是一种人”之类的事情——人应该是具体的。人不是一个抽象的概念;有些人只是人,但没有车辆不是别的东西。

当您想要创建扩展方法时,或者当您有一堆逻辑上适合但不与任何对象关联的代码时,请使用静态类。例如,如果你有一堆相关的数学例程,那是静态类的一个很好的候选者。

抽象类真的是一个我们不能创建它的实例的类吗?

,那不是真的。您可以创建抽象类的实例。您可以通过创建更多派生类的实例来实现。

Vehicle v = new Car();

显然 v 指的是 Vehicle 的实例,因此您可以创建抽象类的实例。你不能做的是创建一个抽象类的实例,它不是一个更派生的具体类的实例。

相比之下,您根本无法创建静态类的实例。

这是一个你没有问的问题:

静态类和抽象类的实现关系是什么?

静态类实际上并不作为 CLR 中的概念存在。当你对一个类说“静态”时,我们实际上做的是生成一个没有公共构造函数的抽象密封类。由于它是抽象的,因此您不能直接创建一个。由于它是密封的,因此您无法创建更多派生类并对其进行实例化。

于 2011-04-14T15:43:48.920 回答
8

确实不可能创建一个abstractstatic类的实例,但这就是相似之处的结束。

  • 可以继承abstract不能继承static
  • 可以有实例方法abstract不能有实例static
  • 一个abstract类可以实现一个static类不能实现的接口

从根本上说,他们试图服务于两个不同的目的

  • 一个abstract类形成一个蓝图/模式,然后以不同且(希望)透明的方式在派生类中实现
  • static只是可能相关static方法集合的容器
于 2011-04-14T15:35:29.240 回答
1

类是必须继承才能使用的abstract类——它只能被继承。
您可以创建继承它的类的实例。

static是根本不能有实例的类;这样的类只有static成员。
static类不能被继承,也不能继承其他类。

于 2011-04-14T15:34:37.450 回答
-3

没错,抽象类不能被实例化,而是形成其他类的基础。好处是您可以将功能放入抽象类以帮助重用。

静态类是由 CLR 在需要时实例化的类。任何时候都只能有一个实例。使用静态类非常有用,但必须注意线程和同时访问。

于 2011-04-14T15:35:04.387 回答