为什么静态类只能有静态成员?

时间:2010-12-11 06:44:07

标签: .net oop class static class-design

正如标题所暗示的,我想理解为什么静态类只能有静态成员。我希望它在所有编程语言中都是一样的。所以我相信所有语言的解释都是一样的。

6 个答案:

答案 0 :(得分:15)

静态类无法实例化,因此它不会有任何实例,非静态成员需要其类的实例才能访问。由于静态类不能有任何实例,因此如果存在任何实例,则无法访问非静态成员。

因此静态类只能有静态成员

答案 1 :(得分:7)

这不是一个设计决定,而是一个逻辑决策。最简单的起点是查看概念的相关定义:

静态类是无法实例化的类。这意味着您无法创建属于该类类型的对象。

非静态成员绑定到类的特定实例。它们包含专门与该类类型的单个对象关联的数据。

因此,如果静态类包含非静态成员,则永远不能访问该数据或调用该方法,因为您永远无法实例化该静态类的类型的对象。相反,您必须拥有可以从类的静态实例直接调用的所有静态成员。

但是,可以包含包含静态成员的非静态类。这样,您可以访问数据或调用作为静态成员公开的方法,而无需实例化该类的对象。但是,您也可以 实例化该类类型的对象并访问非静态(或实例)成员。例如,如果您有一个类Circle,则可以使用静态成员,例如CalculateArea函数和PI字段。这些成员通常只适用于所有圈子,因为它们是圆圈。但是,您也可以拥有与该类的特定实例相关联的非静态成员,因为它们描述了特定的圈子对象。这些可以是字段DiameterCircumference。在给定存储在该特定实例的非静态字段中的数据的情况下,您还可以使用非静态函数来计算圆的面积。

答案 2 :(得分:4)

无法实例化静态类。因此,永远无法访问非静态成员。

如果要混合和匹配静态成员,请不要使该类静态。

答案 3 :(得分:2)

大概是因为实例方法永远不会被调用。

答案 4 :(得分:1)

如果将非静态成员放在静态类中,则它不是静态类。 (你不能实例化一个静态类 - 拥有非静态成员,你必须能够创建调用这些成员的类的实例 - 这将使它成为常规类)

以另一种方式来看,通过将类标记为静态,您故意要求编译器不允许您在该类中放置非静态方法 - 这是您做出的设计决策,以及编译器帮助检查您是否遵循自己的设计。

答案 5 :(得分:-1)

我不确定这是否相关但是(至少在c#.net 4.0中)静态类可以包含非静态类定义,其中包含非静态成员。因此,似乎可以将非静态成员添加到静态类,因为嵌套类型被视为member

示例:

public static class MyClass
{
    /// <summary>
    ///  This non-static class is accessible and able to be instantiated through the 
    ///  static class MyClass.
    /// </summary>
    public class Type1
    {
        public String prop1 { get; set; }
        public String funct1(String result)
        {
            return result;
        }
    }

    /// <summary>
    /// This function is inaccessible since it requires an instance of MyClass.
    /// It will also cause a compile error.
    /// </summary>
    /// <returns></returns>
    public String nonStaticFunc()
    {
        return "aString";
    }

    /// <summary>
    /// This function is accessible through the MyClass type because it is also static
    /// and therefore does not require a class instance.
    /// </summary>
    /// <returns></returns>
    public static String staticFunc(String str)
    {
        return str;
    }
}

如您所见,静态类MyClass有一个非静态类定义Type1,必须为了使用才能实例化。而MyClass中的静态函数staticFunc不需要访问实例。

//Valid operations

String result = MyClass.staticFunc("result"); //No class instance.

MyClass.Type1 someObj = new MyClass.Type1(); //Class instance from static class containing non-static nested type.
someObj.prop1 = someObj.funct1("hi");