C#中的抽象类与静态类

Dan*_*Dan 13 c# abstract-class static-classes

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

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

是抽象类是一个我们无法创建它的实例的类吗?
谢谢

Eri*_*ert 67

我想知道C#中抽象类和静态类之间的区别是什么.

不要问这样的问题.我可以花几个小时列出数百个差异,其中没有一个与你相关.

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

这还差不多.

抽象类通常用于对类型层次结构中的某些内容进行建模.例如,卡车是一种车辆,而飞机是一种车辆,因此您可能拥有基础车辆和派生类卡车和飞机.但"车辆"是抽象的; 没有车辆只是车辆而没有更具体的东西.您用抽象类表示该概念.

相比之下,静态类并不打算对任何东西进行建模.它只是存储一堆代码的便捷方式.真的,它根本不应该是一个阶级; VB通过调用"模块"而不是"类"来做出更好的选择.虽然从技术上讲它们是从对象继承的,但静态类在逻辑上根本不是真正的类型层次结构.它们只是一个用于保持静态成员的桶.

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

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

当您想要构建"X是一种Y"形式的模型时,请使用抽象类.就像"汽车是一种车辆"或"广场是一种形状"或"杂志是一种出版物",其中"Y"是一个抽象的概念.不要将它用于"员工是一种人"这样的事情 - 人应该是具体的.人不是一个抽象的概念; 有些人只是人,但没有其他车辆.

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

是抽象类是一个我们无法创建它的实例的类吗?

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

Vehicle v = new Car();
Run Code Online (Sandbox Code Playgroud)

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

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

这是你没有问过的问题:

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

实际上,静态类并不是CLR中的概念.当你在类上说"静态"时,我们实际做的是生成一个没有公共构造函数的抽象密封类.由于它是抽象的,因此无法直接创建.由于它是密封的,因此无法创建更多派生类并实例化它.

  • +1 - Eric应该是CS教授,@ Eric Lippert你有没有考虑过? (8认同)
  • @JonH:我已经考虑过在社区大学一级教授*编程*,如果我能够使其符合我的日程安排,可能会在2012年冬季进行.作为一名大学教授,我没有足够深入的理论知识. (3认同)

Jar*_*Par 8

确实,创建一个abstractstatic类的实例是不可能的,但这是关于相似性结束的地方.

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

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

  • abstract类形成青色印刷/图案,然后将其在派生类在不同实现,并且(希望)透明的方式
  • static类是简单地为可能与收集容器static的方法