静态类如何从对象派生?

时间:2009-02-17 10:21:29

标签: c# oop

我试图通过静态类继承非静态类。

public class foo
{ }

public static class bar : foo
{ }

我得到了:

  

静态类无法从类型派生。   静态类必须派生自   对象

如何从对象中派生出来?

代码在C#中。

14 个答案:

答案 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#规范说不能这样做。您也无法使用静态类实现接口。您最好的选择是从使用静态类更改为使用使用单例模式的类。您将只有一个实例(类似于静态类的工作方式),您将能够继承行为或实现接口。

您已阅读单身人士hereherehere

答案 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();
        }
    }