可能重复:
What's the difference between an abstract class and a static one?
您好
我想知道C#中抽象类和静态类之间的区别是什么
我什么时候使用什么?为什么?
抽象类是否是一个我们无法创建它的实例的类? 感谢
答案 0 :(得分:67)
我想知道C#中抽象类和静态类之间的区别是什么。
不要问这样的问题。我可以花几个小时列出数百个差异,其中没有一个与你相关。
C#中抽象类和静态类之间最重要的区别是什么?
那更像是它。
抽象类通常用于对类型层次结构中的某些内容进行建模。例如,卡车是一种车辆,而飞机是一种车辆,因此您可能拥有基础车辆和派生类卡车和飞机。但“车辆”是抽象的;没有车辆只是车辆而没有更具体的东西。你用抽象类来表示这个概念。
相比之下,静态类并不打算对任何东西进行建模。它只是存储一堆代码的便捷方式。真的,它根本不应该是一个阶级; VB通过调用“模块”而不是“类”来做出更好的选择。虽然从技术上讲它们是从对象继承的,但静态类在逻辑上根本不是真正的类型层次结构。它们只是一个用于保持静态成员的桶。
静态类通常用作扩展方法的容器。
我何时使用什么以及为什么?
当您想要构建“X是一种Y”形式的模型时,请使用抽象类。就像“汽车是一种车辆”或“广场是一种形状”或“杂志是一种出版物”,其中“Y”是一个抽象的概念。不要将它用于“员工是一种人”这样的事情 - 人应该是具体的。人不是一个抽象的概念;有些人只是人,但没有其他车辆。
当您想要创建扩展方法时,或者当您有一堆逻辑上适合但不与任何对象关联的代码时,请使用静态类。例如,如果你有一堆相关的数学例程,那么它就是静态类的一个很好的候选者。
抽象类是否是一个我们无法创建它的实例的类?
否。 不为真。您可以创建抽象类的实例。您可以通过创建更多派生类的实例来实现此目的。
Vehicle v = new Car();
显然,v是指Vehicle的一个实例,因此您可以创建一个抽象类的实例。你不能做的是创建一个抽象类的实例,它不是更具派生的具体类的实例。
相比之下,您根本无法创建静态类的实例。
这是你没有问过的问题:
静态类和抽象类之间的实现关系是什么?
静态类实际上并不真正作为CLR中的概念存在。当你在类上说“静态”时,我们实际做的是生成一个没有公共构造函数的抽象密封类。由于它是抽象的,因此无法直接创建。由于它是密封的,因此无法创建更多的派生类并实例化它。
答案 1 :(得分:8)
确实,不可能创建abstract
或static
类的实例,但这是关于相似性结束的地方。
abstract
无法继承自static
abstract
上的实例方法无法在static
abstract
类可以实现static
类不能从根本上说,他们正在努力实现两个不同的目的
abstract
类形成蓝色打印/模式,然后以不同和(希望)透明的方式在派生类中实现static
类只是一个可能相关的static
方法集合的容器答案 2 :(得分:1)
abstract
类是必须继承才能使用的类 - 它只能被继承。
您可以创建继承它的类的实例。
static
类是一个根本不能拥有实例的类;这样的班级只有static
名成员
static
类不能继承,也不能继承其他类。
答案 3 :(得分:-3)
确实,抽象类不能实例化,而是形成其他类的基础。好处是您可以将功能放入抽象类中以帮助重用。
静态类是在需要时由CLR实例化的类。任何时候都只能有一个实例。使用静态类非常有用,但必须注意线程和同时访问。