Heredar constantes: ¿mejor estilo?

Esta es más una pregunta de "¿hay una mejor manera?" Que un problema real.

Al tener una propiedad a la que solo se accede en una clase base:

 private const bool isSomething = true;

A veces tengo que cambiar este valor en un proyecto donde heredo de esta clase. Pero como es una constante y se usa en toda la clase, normalmente cambio el código en la clase base a algo como esto:

 private const bool isSomething = true;
 protected virtual bool IsSomething{
       get{
           return isSomething;
       }
 }

Y anule la propiedad en la subclase y cree una nueva isSomething constante.

Esto crea un nuevo campo y una anulación y, en mi opinión, no es un estilo agradable. ¿Hay una mejor manera de hacer esto?

El valor es una constante y será constante en el proyecto completo donde lo estoy usando.

preguntado el 16 de mayo de 11 a las 20:05

Entonces, en todas partes se necesita algo, ¿llama a IsSomething () en su lugar? -

@ n8wrl: sí, esta es mi solución actual para tener una constante anulable en toda la clase. -

Parece un candidato perfecto para una propiedad protegida de solo lectura en la clase base, no se necesita virtual / override. -

1 Respuestas

Si necesita establecer el valor en función de la clase en la que se encuentra, pero no desea que el valor cambie más tarde, entonces const no es la palabra clave correcta. En su lugar, puede utilizar readonly y requieren que las subclases pasen un valor al constructor.

La palabra clave readonly es diferente de la palabra clave const. Un campo constante solo se puede inicializar en la declaración del campo. Un campo de solo lectura se puede inicializar en la declaración o en un constructor. Por lo tanto, los campos de solo lectura pueden tener diferentes valores según el constructor utilizado. Además, mientras que un campo const es una constante en tiempo de compilación, el campo de solo lectura se puede usar para constantes en tiempo de ejecución ... Fuente

Edit:
Para resumir: tiene un archivo al que solo accede la clase base y la clase base nunca debe alterar ese valor. En la mayoría de los casos, el valor predeterminado está bien. Sin embargo, hay algunos casos que surgen cuando una subclase necesita establecer su propio valor que es diferente al predeterminado.

class Base {
  private readonly bool _isSomething;

  public Base() : this(false) {}

  protected Base(bool isSomething)
  {
    _isSomething = isSomething;
  }
}
class Child {
  public Child() : base(true) {}
}

Esto proporciona la misma funcionalidad que la solución alternativa sugerida. El valor no se puede cambiar y solo una clase secundaria puede proporcionar un valor diferente. Tiene el beneficio adicional de no permitir que la clase secundaria invalide el hecho de que el valor debe ser constante. El método de anulación permite esto:

protected override bool IsSomething{
   get{
     return BOOLEAN_EXPRESSION;
   }
}

Entiendo su idea de convertirlo en un valor estático (ya que sabemos que todas las instancias usarán el mismo valor), pero eso solo complica las cosas ya que los elementos estáticos no se heredan.

contestado el 17 de mayo de 11 a las 01:05

Es más en qué proyecto estoy que en qué clase, por lo que sería una lectura estática. Pero una lectura estática no se puede establecer en una clase heredada de lo que he probado. - Michael

Ok, tener una bandera estática es probablemente el principal problema, ya que no quería crear la impresión de que el valor puede tener configuraciones diferentes en una instancia de programa. Pero esta es al menos una alternativa entre la que puedo elegir según el caso. - Michael

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.