C#中的抽象类与静态类

本文关键字:静态类 抽象类 | 更新日期: 2023-09-27 17:50:06

可能重复:
什么';抽象类和静态类的区别是什么?

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

抽象类是一个我们不能创建其实例的类,这是真的吗
感谢

C#中的抽象类与静态类

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

不要问那样的问题。我可以花几个小时列出数百种差异,但没有一种与您相关。

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

更像这样。

抽象类通常用于对类型层次结构中的某些内容进行建模。例如,卡车是一种车辆,飞机是一种交通工具,因此您可能有一个基类vehicle和派生类truck和airplane。但"车辆"是抽象的;没有任何车辆,它们只是车辆,而不是某种更具体的东西。你用一个抽象类来表示这个概念。

相比之下,静态类根本不打算为任何东西建模。这只是存储一堆代码的一种方便方式。真的,这根本不应该是一门课;VB做了一个更好的选择,将这些东西称为"模块"而不是"类"。尽管从技术上讲,静态类继承自对象,但从逻辑上讲,它们根本不在类型层次结构中。它们只是一个用来容纳静态成员的桶。

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

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

当你想构建一个"X是Y的一种"形式的模型时,可以使用一个抽象类。就像"汽车是一种车辆"、"正方形是一种形状"或"杂志是一种出版物",其中"Y"是一个抽象的概念。不要把它用于"员工是一种人"之类的事情——人应该是具体的。人不是一个抽象的概念;有些人只是人,但没有不是其他东西的车辆。

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

抽象类是一个我们不能创建其实例的类,这是真的吗?

没有这不是真的。您可以创建抽象类的实例。您可以通过创建一个派生类的实例来实现这一点。

Vehicle v = new Car();

显然,v引用了Vehicle的一个实例,因此您可以创建一个抽象类的实例。您不能创建一个抽象类的实例,该实例不是派生程度更高的具体类的实例。

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

这是一个你没有问的问题:

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

静态类实际上并不是CLR中真正存在的概念。当你对一个类说"static"时,我们实际要做的是生成一个没有公共构造函数的抽象密封类。由于它是抽象的,所以不能直接创建。由于它是密封的,所以您不能创建一个更派生的类并实例化它。

确实不可能创建abstractstatic类的实例,但这就是相似性的终点。

  • 可以从abstract继承不能从static继承
  • 可以在abstract上具有实例方法不能在static上具有实例
  • abstract类可以实现static类不能实现的接口

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

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

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

static类是一个根本不能有实例的类;这样的类仅具有CCD_ 14成员
static类不能继承,也不能继承其他类。

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

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