【发布时间】:2010-10-08 01:24:03
【问题描述】:
我正在尝试通过静态类继承非静态类。
public class foo
{ }
public static class bar : foo
{ }
我得到:
静态类不能从类型派生。 静态类必须派生自 对象。
如何从对象派生它?
代码在 C# 中。
【问题讨论】:
-
这个有用例吗?
我正在尝试通过静态类继承非静态类。
public class foo
{ }
public static class bar : foo
{ }
我得到:
静态类不能从类型派生。 静态类必须派生自 对象。
如何从对象派生它?
代码在 C# 中。
【问题讨论】:
OP 询问“我怎样才能从对象中驱动它?”。 object 这里不是另一个类的实例,所以答案是你没有。 object 指的是 System.Object 基类,它是 .NET 中所有类型的默认基类。错误信息有点误导。
为了完整起见,另一方面,静态类也不能被继承或扩展,因为它既是抽象类又是密封类。
【讨论】:
正如 Christopher 所指出的,假设我们可以从非静态类派生静态类。
例如:
public class foo
{
public int myVar;
}
public static class bar : foo { }
这里,bar 类派生自 foo,因此静态类 Bar 现在具有非静态成员 myVar ,并且根据c#规范,静态类不能包含非静态成员!
【讨论】:
派生静态类没有任何价值。使用继承的原因是:
显然,您不能使用静态类获得多态性,因为没有实例可以动态调度(换句话说,您不能将 Bar 传递给期望 Foo 的函数,因为您不 有一个酒吧)。
使用组合很容易解决代码重用:给 Bar 一个 Foo 的静态实例。
【讨论】:
foo 的用例有一些 bar 想使用的受保护方法。
Foo 的 static Bar 类,以便它可以访问它的受保护成员?这种设计有很多问题(很少有单个类在静态和非静态上下文中都有意义)。但是,假设您对此有正当理由,一种解决方案是让Bar 拥有一个继承自Foo 的私有内部非静态类(称为FooWrapper)。它具有转发给它继承的受保护方法的公共方法。然后Bar 可以拥有FooHelper 的实例并通过它访问Foo 中的受保护成员。
正如在其他答案中所说,编译器消息令人困惑但正确。你可以写:
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();
}
}
【讨论】:
静态类不能是其他类的基类,也不能扩展。
静态类只能从“对象”类(.net 基类)继承。
附加信息:.net 中的所有类都继承自“object”类,甚至任何静态类也是如此。
不同之处在于,即使静态类继承了“对象类”,它也只继承了“对象”类的两个静态方法。
其他非静态类继承其他四种方法。
【讨论】:
错误消息是虚假的。它不是说“一个”对象。它谈论的是称为“对象”的内置类型,它是 .NET 中所有内容的基础。
应该说“静态类不能指定基类型”。
【讨论】:
如果您试图阻止人们创建该类的实例,只需添加一个私有默认构造函数。
【讨论】:
我认为 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
}
【讨论】:
取自http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx
静态类的主要特点 是:
它们只包含静态成员。
它们不能被实例化。
它们是密封的。
它们不能包含实例 构造函数(C# 编程指南)。
因此,通过将非静态成员引入静态类,从非静态类继承违反了此列表中静态类的第一个特性。
【讨论】:
来自 C# 3.0 规范,第 10.1.1.3 节:
静态类不能包含 class-base 规范 (§10.1.4) 和 无法显式指定基类 或已实现接口的列表。一种 静态类隐式继承自 输入
object。
换句话说,你不能这样做。
【讨论】:
错误信息具有误导性。
bar 不能从 foo 继承,因为 foo 可以被实例化而 bar 不能。
【讨论】:
所有类都隐式派生自 Object。也就是说,尽管静态类(根据定义只是静态成员的容器)从对象“派生”,但您无法从这个事实中得到任何信息。
【讨论】:
不能。您必须创建一个普通类才能从其他类派生。
【讨论】:
不是所有的类(包括静态的)都派生自对象吗?就像默认情况下一样?
另外,就像它说的,“静态类不能从类型派生。”,所以我不认为你在做什么是可能的。为什么还要从一个类型派生一个静态类?
【讨论】: