一个静态类如何从一个对象派生?

我想通过静态类inheritance非静态类。

public class foo { } public static class bar : foo { } 

我得到:

静态类不能从types派生。 静态类必须从对象派生。

我如何从对象中派生出来?

代码是用C#编写的。

派生静态类没有任何价值。 使用inheritance的原因是:

  • 多态性
  • 代码重用

你不能用静态类获得多态,显然,因为没有实例可以dynamic调度(换句话说,就像你没有Bar一样,你可以把一个Bar传给期望Foo的函数) 。

代码重用很容易使用组合来解决:给Bar一个Foo的静态实例。

从C#3.0规范的第10.1.1.3节:

静态类可能不包含基类规范(第10.1.4节),不能明确指定基类或实现接口列表。 一个静态类隐式地从typesobjectinheritance。

换句话说,你不能这样做。

错误消息是假的。 这不是说“一个”的对象。 这就是在.NET中所谓的“对象”的内置types,它是所有东西的基础。

应该说“静态类不能指定一个基types”。

取自http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx

静态类的主要特点是:

他们只包含静态成员。

他们不能被实例化。

他们被密封。

它们不能包含实例构造函数(C#编程指南)。

所以,从非静态类inheritance违反静态类的第一个特性,通过向静态类引入非静态成员。

我不认为C#支持静态类的inheritance。

一种select是使用单例模式

 public class foo { } public class bar : foo { private bar instance; public bar GetInstance() { if(instance == null) instance = new bar(); return instance; } private bar(){} //make default constructor private to prevent instantiation } 

就像前面说的那样,C#规范说这是不能做的。 你也不能用静态类实现一个接口。 你最好的select是从使用静态类到使用单例模式的类。 您将只有一个实例(类似于静态类的工作方式),您将能够inheritance行为或实现接口。

你在这里 , 这里和这里读单身汉。

不是所有的类(包含静态的)都已经从对象派生出来吗? 如在默认情况下?

此外,就像它说,“静态类不能从types派生”,所以我不认为你在做什么是可能的。 为什么你想要一个静态类从一个types派生?

它不能。 你必须创build一个普通的类来从其他类派生。

所有类都从Object隐式派生。 也就是说,虽然静态类(根据定义,它只是静态成员的容器)“从对象派生”,但是从这个事实中没有任何东西可以得到。

错误消息是误导。

bar不能从fooinheritance,因为foo可以被实例化,bar不能。

如果您试图阻止人们创build类的实例,只需添加一个私有的默认构造函数。

静态类不能为其他类的基类,它不能被扩展。

静态类只能从“对象”类(.net基类)inheritance。

附加信息:.net中的所有类都从“对象”类inheritance,即使是任何静态类也是如此。

不同的是,即使静态类inheritance“对象类”,它只从“对象”类inheritance两个静态方法。

其他非静态类inheritance其他四种方法。

正如在其他答案中所说,编译器的消息是混淆,但正确的。 你可以写:

 static class A : object { } 

当然,明确声明这个inheritance并不是很有用,但是当你覆盖对象的虚拟成员时,inheritance本身在框架中实际上是有用的:

  static class A : object { public static new string ToString() { return "I am object A"; } public static new int GetHashCode() { return ToString().GetHashCode(); } } 

正如克里斯托弗所指出的,假设我们可以从非静态类派生静态类。

例如:

 public class foo { public int myVar; } public static class bar : foo { } 

在这里, bar类是从foo派生的,所以静态类Bar现在有非静态成员myVar了,根据c#规范,Static Class不能包含非静态成员!