C#中的抽象类vs静态类

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

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

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

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

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

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

这还差不多。

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

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

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

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

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

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

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

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

Vehicle v = new Car(); 

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

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

这是你没有问过的问题:

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

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

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

  • 可以从abstractinheritance而不能从staticinheritance
  • 可以在abstract上有实例方法, static上不能有实例
  • abstract类可以实现static类不能实现的接口

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

  • abstract类形成蓝色打印/模式,然后以不同的(希望)透明的方式在派生类中实现
  • static类只是可能相关的static方法集合的容器

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

static类是一个根本不能拥有实例的类; 这样的类只有static成员。
static类不能inheritance,也不能inheritance其他类。

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

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