如何声明一个不能被实例化的类?有哪些方法?

9

如何创建一个不可实例化的类?其中一种方法是将其声明为抽象类。将类构造函数设为私有,是否也可以实现这个目的?密封类是否也是不可实例化的?在C#中还有其他方法吗?


1
你想对这个类做什么? - Jay
答案 = 静态类 - MajkeloDev
抽象类、静态类不能被实例化。 - Dragon
@MajkeloDev 谢谢。但是如果类的构造函数是私有的,我们不能创建该类的实例吗? - kakkarot
1
有了私有构造函数,仍然可以实例化类,但只能在类内部进行。 - M.kazem Akhgary
1
@M.kazemAkhgary ...和通过反射。除了方便之外,没有什么能阻止人们实例化它。如果你想让它变得不可能,抽象或静态是可行的方法。 - sara
4个回答

10

将一个类标记为抽象或静态(它们是互斥的)是唯一的两种方式。将所有构造函数标记为私有并不能使类无法实例化,因为该类仍然可以构造自身,并且其他人可能会通过反射来完成实例化。


@madmax sealed类是不可继承的。 - M.kazem Akhgary
1
但是,一个无法(通常)被实例化的密封类是一种自相矛盾的事情。那它有什么用处呢? - H H
@kai 什么是反射? - kakkarot
反射是一种以编程方式访问类型和程序集信息的方法。它可用于获取类型信息、动态创建对象、访问私有成员等。您可以在此处阅读更多信息:https://msdn.microsoft.com/sv-se/library/ms173183.aspx - sara
1
在构造函数中抛出异常会使类无法实例化。 - undefined
显示剩余2条评论

2

如其他人所回答的,抽象类和静态类不能被实例化,然而一个有私有构造函数的类可以通过使用公共成员函数来实例化。这就是singleton模式的工作原理。


2

在这里,只有 static 看起来是完整的解决方案,因为当从它继承的类实例化时,abstract 类仍然可以被实例化。考虑以下情况:

abstract class A {  }

class B : A {  } 

somewhere in code :

B instance = new B();  // this creates instance of class A as well

附注: 一开始我认为abstract sealed也许是解决这个问题的方法,但使用这样的结构并没有多大意义,所以它甚至无法编译:

Error   1   'A': an abstract class cannot be sealed or static   D:\Projects\TEST\Testapp\Program.cs 15  27  ITT.Domain

我同意。在 .Net 中,您可以获取一个 Stream 实例。当然,它总是一个 Stream 子类的实例。但对于 Stream 类内部和外部的代码来说,该实例仍然是一个实例。 - heijp06
什么是抽象密封类?有人能解释一下吗? - kakkarot
很高兴提到它,但抽象密封是不可能的。 - M.kazem Akhgary
我相信 abstract sealed 甚至无法编译。 - pwas
2
在C#中的static编译为MSIL时是abstract sealed - user4003407
显示剩余4条评论

1

内部类只能在您的程序集内部可见,因此无法在该程序集外部实例化。

但据我所知,您仍然可以通过反射创建一个实例。您可以通过 ReflectionPermission Class 禁用反射。

如上所述,您可以将其声明为抽象或添加一个抽象方法。

如果您只想声明一个协定,那么您可以使用接口,但那不是一个类。

密封类意味着您不能继承这个类。

单例类每个应用程序只能创建一次 singleton

参见 sealed (C# reference)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接