我试图通过静态类继承非静态类。
public class foo
{ }
public static class bar : foo
{ }
我得到了:
静态类无法从类型派生。 静态类必须派生自 对象
如何从对象中派生出来?
代码在C#中。
答案 0 :(得分:51)
导出静态类没有价值。使用继承的原因是:
显然,你无法使用静态类获得多态性,因为没有动态调度的实例(换句话说,它不像你可以将一个Bar传递给一个期望Foo的函数,因为你没有< em> 一个吧。)
使用组合很容易解决代码重用:给Bar一个静态的Foo实例。
答案 1 :(得分:23)
从C#3.0规范,第10.1.1.3节:
静态类可能不包含a class-base 规范(第10.1.4节)和 无法显式指定基类 或已实现的接口列表。一个 静态类隐式继承自 输入
object
。
换句话说,你不能这样做。
答案 2 :(得分:13)
错误消息是假的。它不是说“一个”对象。它正在讨论称为“对象”的内置类型,它是.NET中所有内容的基础。
应该说“静态类不能指定基类型”。
答案 3 :(得分:8)
取自http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx
静态类的主要特征 是:
它们只包含静态成员。
它们无法实例化。
他们是密封的。
他们不能包含实例 构造函数(C#编程指南)。
因此,从非静态类继承违反了此列表中静态类的第一个特性,方法是将非静态成员引入静态类。
答案 4 :(得分:2)
我认为C#不支持静态类的继承。
一种选择是使用单例模式
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
}
答案 5 :(得分:1)
如前所述,C#规范说不能这样做。您也无法使用静态类实现接口。您最好的选择是从使用静态类更改为使用使用单例模式的类。您将只有一个实例(类似于静态类的工作方式),您将能够继承行为或实现接口。
答案 6 :(得分:1)
正如克里斯托弗指出的那样,假设我们可以从非静态类派生出静态类。
例如:
public class foo
{
public int myVar;
}
public static class bar : foo { }
此处, bar 类派生自 foo ,因此静态类 Bar 现在具有非静态成员 myVar ,根据c#规范,静态类不能包含非静态成员!
答案 7 :(得分:0)
是不是所有类(包含静态)都来自对象?如在默认情况下?
另外,就像它说的那样,“静态类不能从类型派生出来。”所以我不认为你在做什么是可能的。为什么你想要从类型派生静态类呢?
答案 8 :(得分:0)
它不能。你必须创建一个普通的类来从其他类派生。
答案 9 :(得分:0)
所有类都是从Object
隐式派生的。也就是说,虽然静态类(根据定义只是静态成员的容器)从对象“派生”,但是没有什么可以从这个事实中获得。
答案 10 :(得分:0)
错误消息具有误导性。
bar不能从foo继承,因为foo可以实例化而bar不能。
答案 11 :(得分:0)
如果您试图阻止人们创建该类的实例,只需添加一个私有默认构造函数。
答案 12 :(得分:0)
static class不能是其他类的基类,也不能扩展。
静态类只能从“object”类(.net基类)继承。
附加信息:.net中的所有类都继承自“object”类,甚至是任何静态类。
区别在于静态类继承“对象类”,它只从“对象”类继承了两个静态方法。
其他非静态类继承其他四种方法。
答案 13 :(得分:0)
如在其他答案中所述,编译器消息令人困惑但正确。你可以写:
static class A : object
{
}
当然,显式声明这种继承并不是真正有用,但是当你覆盖对象的虚拟成员时,继承本身在框架中实际上是有用的:
static class A : object
{
public static new string ToString()
{
return "I am object A";
}
public static new int GetHashCode()
{
return ToString().GetHashCode();
}
}