问题描述
|
这个问题已经在这里有了答案:
解决方法
我想知道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实例化的类。任何时候都只能有一个实例。使用静态类非常有用,但是必须注意线程和同时访问。