2010-12-11 22 views
7

Como el título sugiere, me gustaría entender por qué las clases estáticas solo pueden tener miembros estáticos. Espero que sea el mismo en todos los lenguajes de programación. Entonces la explicación sería la misma para todos los idiomas, creo.¿Por qué las clases estáticas solo pueden tener miembros estáticos?

+3

Suena un poco casero ... ¿has pensado en esto? ¿Qué propósito habría para permitir miembros no estáticos en una clase estática? – mpen

+0

Sé que la regla 'clase estática no puede tener miembros no estáticos'. Pero quería entender por qué. De hecho, esperaba respuestas más frikis en términos de memoria, como la forma en que se almacenan las clases estáticas y sus miembros y cómo se almacenan las clases y los miembros no estáticos. :) – NLV

Respuesta

14

No se pueden crear instancias de clases estáticas, por lo tanto, no tendrá ninguna instancia, los miembros no estáticos necesitarían una instancia de su clase para acceder. Como la clase estática no puede tener ninguna instancia, no puede acceder a los miembros no estáticos si los hay.

Por lo tanto clases estáticas pueden tener sólo los miembros estáticos

2

Presumiblemente debido a los métodos de instancia nunca podrían ser llamados.

1

Si coloca un miembro no estático en una clase estática, no sería una clase estática. (No puede instanciar una clase estática: para tener miembros no estáticos, debe poder hacer instancias de la clase para llamar a esos miembros, lo que la convertiría en una clase normal)

Para verla De otra forma, al marcar una clase como estática, usted está pidiendo deliberadamente que el compilador no le permita poner métodos no estáticos en esa clase: esta es una decisión de diseño que ha tomado, y el compilador ayuda a verificar que usted siga el suyo diseño.

4

No se puede crear una instancia de una clase estática. Por lo tanto, nunca se podría acceder a los miembros no estáticos.

Si desea mezclar y unir los miembros estáticos, no haga la clase estática.

7

No es una decisión de diseño, sino lógica. El lugar más fácil para comenzar es mirando las definiciones relevantes de los conceptos:

Una clase estática es aquella que no puede ser instanciada. Eso significa que no puede crear objetos que sean del tipo de esa clase.

Los miembros no estáticos están vinculados a una instancia específica de una clase. Contienen datos que están asociados exclusivamente con un único objeto de ese tipo de clase.

Por lo tanto, si una clase estática contiene miembros no estáticos, nunca podría acceder a esos datos o llamar a ese método porque nunca podría crear una instancia de un objeto de ese tipo de clase estática. En su lugar, debe tener todos los miembros estáticos que se pueden invocar directamente desde una instancia estática de la clase.

Sin embargo, usted puede tienen clases no estáticas que contienen miembros estáticos. De esta manera, puede acceder a los datos o llamar a los métodos expuestos como miembros estáticos sin instanciar un objeto de esa clase. Sin embargo, puede también crear instancias de un objeto del tipo de esa clase y acceder a miembros no estáticos (o instancia). Por ejemplo, si tenía una clase Circle, podría tener miembros estáticos como una función CalculateArea y un campo PI. Estos miembros son aplicables a todos los círculos, en general, solo por el hecho de que son círculos. Pero también podría tener miembros no estáticos asociados con instancias específicas de esa clase, porque describen objetos de círculo específicos. Estos podrían ser los campos Diameter y Circumference.También podría tener funciones no estáticas que calculen el área del círculo, dados los datos almacenados en los campos no estáticos para esa instancia particular.

-1

No estoy seguro si esto está relacionado pero (en C# .net 4.0 al menos) una clase estática puede contener definiciones de clase no estáticas que contienen miembros no estáticos. Por lo tanto, parece que puede agregar miembros no estáticos a una clase estática porque un tipo anidado se considera member.

Ejemplo:

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; 
    } 
} 

Como se puede ver, la clase MyClass estática tiene un Tipo1 definición de clase no estática que debe ser instanciado con el fin de utilizar. Mientras que la función estática staticFunc en MyClass no necesita una instancia para acceder.

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