Почему статические классы могут иметь только статические члены? - PullRequest
7 голосов
/ 11 декабря 2010

Как следует из названия, я хотел бы понять, почему статические классы могут иметь только статические члены.Я надеюсь, что это одинаково на всех языках программирования.Так что, я думаю, объяснение будет одинаковым для всех языков.

Ответы [ 6 ]

15 голосов
/ 11 декабря 2010

Статические классы не могут быть созданы, следовательно, он не будет иметь никакого экземпляра. Нестатическим членам потребуется доступ к экземпляру их класса.Поскольку статический класс не может иметь никакого экземпляра, вы не можете получить доступ к нестатическим членам, если они есть.

Следовательно, статические классы могут иметь только статические члены

7 голосов
/ 11 декабря 2010

Это не дизайнерское решение, а скорее логичное.Начать проще всего с рассмотрения соответствующих определений понятий:

Статический класс - это класс, экземпляр которого невозможно создать. Это означает, что вы не можете создавать объекты, относящиеся к типу этого класса..

Нестатические члены связаны с конкретным экземпляром класса. Они содержат данные, которые исключительно связаны с одним единственным объектом этого типа класса.

Таким образом, если статический класс содержит нестатические члены, вы никогда не сможете получить доступ к этим данным или вызвать этот метод, потому что вы никогда не сможете создать экземпляр объекта этого статического класса.Вместо этого у вас должны быть все статические члены, которые можно вызывать напрямую из статического экземпляра класса.

Однако вы можете иметь нестатические классы, которые содержатстатические члены.Таким образом, вы можете получить доступ к данным или вызвать методы, представленные как статические члены, без создания экземпляра объекта этого класса.Тем не менее, вы можете также создать экземпляр объекта этого класса и получить доступ к нестатическим (или экземплярам) членам.Например, если у вас был класс Circle, вы могли бы иметь статические члены, такие как функция CalculateArea и поле PI.Эти члены применимы ко всем кругам, как правило, просто в силу того, что они являются кругами.Но у вас также могут быть нестатические члены, которые связаны с конкретными экземплярами этого класса, поскольку они описывают определенные объекты круга.Это могут быть поля Diameter и Circumference.Вы также можете иметь нестатические функции, которые вычисляют площадь круга, учитывая данные, хранящиеся в нестатических полях для этого конкретного экземпляра.

4 голосов
/ 11 декабря 2010

Статический класс не может быть создан. Поэтому к нестатическим элементам никогда нельзя получить доступ.

Если вы хотите смешивать и сопоставлять статические члены, не делайте класс статичным.

2 голосов
/ 11 декабря 2010

Предположительно, потому что методы экземпляра никогда не могут быть вызваны.

1 голос
/ 11 декабря 2010

Если вы поместите нестатический член в статический класс, это не будет статический класс.(Вы не можете создать экземпляр статического класса - чтобы иметь нестатические члены, вы должны иметь возможность создавать экземпляры класса для вызова этих членов - что делало бы его обычным классом)

Чтобы посмотретьс другой стороны, помечая класс как статический, вы сознательно просите компилятор не позволять вам помещать нестатические методы в этот класс - это принятое вами проектное решение, и компилятор помогает проверить, что вы соблюдаетеваш собственный дизайн.

0 голосов
/ 02 мая 2012

Я не уверен, связано ли это с этим, но (по крайней мере, в 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, которое необходимо использовать для использования.В то время как статическая функция staticFunc в MyClass не требует доступа к экземпляру.

//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");
...