C#中的抽象类与静态类[重复]

问题描述

|                                                                                                                   这个问题已经在这里有了答案:                                                      

解决方法

  我想知道C#中抽象类和静态类之间的所有区别是什么。 不要问这样的问题。我可以花几个小时列出数百个差异,这些差异与您无关。   C#中抽象类和静态类之间最重要的区别是什么? 这还差不多。 抽象类通常用于在类型层次结构中建模。例如,卡车是一种车辆,而飞机是一种车辆,因此您可能拥有基类Vehicle和派生类Truck and 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实例化的类。任何时候都只能有一个实例。使用静态类非常有用,但是必须注意线程和同时访问。