¿Cuál es la mejor manera de inicializar constantes u otros campos en clases heredadas? Me doy cuenta de que hay muchos errores de sintaxis en este ejemplo, pero este es el mejor ejemplo para explicar claramente lo que estoy tratando de hacer.Inicializando campos en clases heredadas
public abstract class Animal {
public abstract const string Name; // #1
public abstract const bool CanFly;
public abstract double Price; // price is not const, because it can be modified
public void Fly() {
if (!CanFly)
Debug.Writeln("{0}s can't fly.", Name);
else
Debug.Writeln("The {0} flew.", Name);
}
}
public class Dog : Animal {
public override const string Name = "Dog"; // #2
public override const bool CanFly = false;
public override double Price = 320.0;
}
public class Bird : Animal {
public override const string Name = "Bird";
public override const bool CanFly = true;
public override double Price = 43.0;
}
Un par de cosas que estoy tratando de lograr:
- clases base deben asignar estos 3 campos.
- Idealmente, me gustaría que estos campos inicializados estuvieran juntos en la parte superior de la clase para poder ver qué constantes asigné a cada clase y cambiarlas cuando sea necesario.
- Los campos Nombre y CanFly no se pueden cambiar.
Sé que podría inicializar estos campos en un constructor (si se deshace de la const), pero no se garantiza que se asignarán. Si tiene estos campos como propiedades en su lugar y los reemplaza, aún deberá inicializar el campo de respaldo de la propiedad. ¿Cómo implementarías esto?
Unos pocos errores de sintaxis se queja:
- El modificador 'abstracta' no es válido en los campos. Intenta usar una propiedad en su lugar. (# 1)
- Un campo const requiere un valor que se proporciona (# 1)
- El 'anulación' modificador no es válido para este elemento (# 2)
Creo que estás entendiendo mal para qué son las constantes. Las constantes son para valores que nunca cambian a lo largo de la historia del universo; de ahí, el nombre "constante". Buenos ejemplos de constantes: el número de huevos en una docena, el número atómico de plomo. Malo: el número de versión de su aplicación; esto cambia con el tiempo Terrible: el precio del barril de petróleo; cambia cada pocos segundos. Si hay un campo cuyo valor puede cambiar durante el tiempo de vida de su aplicación, no es una constante. –
Gracias por la explicación. Creo que estaba un poco confundido porque los campos Dog.Name y Dog.CanFly nunca deberían cambiarse, por lo tanto, creo que deberían ser constantes. Sin embargo, los campos Animal.Name y Animal.CanFly se cambiarán por clases heredadas, por lo que no deberían ser constantes. Intenté definirlos como constantes solo en clases heredadas, lo que supongo que no puedes hacer. – Senseful
Para modelar un valor que se establece una vez en el momento de la construcción y nunca más después, use un campo de solo lectura. Los campos de solo lectura pueden ser campos de instancia, en cuyo caso puede tener un valor diferente para cada instancia, o estáticos, en cuyo caso cada instancia comparte el mismo valor. –