2012-06-22 27 views
5

He leído a través de los artículos seguir paraclase derivada Llamando al método estático de la clase base en su propio método estático

Todos parecen muy cerca mi pregunta y tengo buenas respuestas, pero no parecen responder a mi pregunta más que decir que necesito que el método no sea estático.

un ejemplo:

abstract public class baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property1","property2"}); 
    // code for property definition and access 
    virtual public static bool ValidAttribtue(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
      return true; 
     else 
      return false; 
    } 
} 
class derivedA : baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property3","property4"}); 
    // code for property definition and access 
    public static override bool ValidAttribute(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
     { 
      return true; 
     } 
     else 
     { 
      return base.ValidAttribute(attributeName); 
     } 
    } 
} 
class derivedB : baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property10","property11"}); 
    // code for property definition and access 
    public static override bool ValidAttribute(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
     { 
      return true; 
     } 
     else 
     { 
      return base.ValidAttribute(attributeName); 
     } 
    } 
} 

derivedA tendría propiedades 1,2,3,4 mientras derivedB tendría propiedades 1,2,10,11. La lista de propiedades parece ser un valor específico de clase y no se puede cambiar en ningún momento. Yo pensaría que entonces sería estático.

¿Es incorrecto mi diseño en el sentido de que estoy tratando de usar métodos estáticos cuando no deberían?

El ejemplo anterior me hace pensar que la herencia de métodos estáticos sería necesaria, sin embargo, parece que tratar de hacer esto es un defecto de diseño. ¿Alguien puede ayudarme a entender qué está mal con las clases de codificación o estructuración de esta manera?

+0

Es este código real? No puede tener miembros estáticos virtuales. –

+0

No, es solo el código de ejemplo de una operación que estaba pensando que podría ser posible. –

Respuesta

8

¿Es incorrecto mi diseño en el sentido de que estoy tratando de usar métodos estáticos cuando no deberían?

Sí. Aparte de cualquier otra cosa, intentas declarar un método estático como virtual (y luego anularlo), lo cual no está permitido. También está tratando de declarar una clase llamada base, cuando esa es una palabra clave.

Los métodos estáticos simplemente no son polimórficos. La base del polimorfismo es que el tipo de tiempo de ejecución de la instancia involucrada puede ser diferente al tipo de tiempo de compilación de la expresión, y la implementación se elige sobre la base del tipo de tiempo de ejecución. Ese concepto no tiene sentido para los métodos estáticos, ya que es sin instancia.

Ahora, por supuesto, puede hacer que un método estático en una llamada de clase derivada sea un método estático en la clase base, pero no habrá ningún polimorfismo en ninguna parte.

Como nota al margen, todos sus métodos se podría escribir de una manera más legible:

// Base class implementation 
return attributeNames.Contains(attributeName); 

// Derived class implementations 
return attributeNames.Contains(attributeName) || 
     BaseClass.ValidAttribute(attributeName); 
+0

Para asegurarme de que estoy entendiendo esto correctamente, la clase abstracta define la operación que tendrán todas las clases derivadas. Las clases derivadas necesitan la funcionalidad que está ahí. La comprobación no cambia nunca y está completamente definida en tiempo de compilación. La presencia o ausencia de una propiedad se conoce en tiempo de compilación. La verificación debe cambiar por clase pero debería poder aprovechar la función de clases base. ¿Esta construcción entre sí no es un mecanismo estático sino un mecanismo de polimorfismo? –

+0

@JohnGroman: si no * necesita * polimorfismo, es decirinvocando la implementación "correcta" en el momento de la ejecución en función del tipo de instancia, puede hacerlo sin polimorfismo. Le recomendaría encarecidamente que le dé a los métodos diferentes nombres para que quede más claro que realmente * no * está ocurriendo ningún polimorfismo, pero funcionará, en términos del método estático de una clase derivada que llama al método estático de una clase base. Es solo otro método estático, en lo que se refiere al lenguaje, no hay relación entre los dos. –

+0

Gracias por las respuestas y los comentarios, creo que necesito leer más sobre el polimorfismo. También gracias por la forma más legible –

Cuestiones relacionadas