一个静态类如何从一个对象派生?
我想通过静态类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节),不能明确指定基类或实现接口列表。 一个静态类隐式地从types
object
inheritance。
换句话说,你不能这样做。
错误消息是假的。 这不是说“一个”的对象。 这就是在.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不能包含非静态成员!