Tengo una clase base abstracta y deseo declarar un campo o una propiedad que tendrá un valor diferente en cada clase que herede de esta clase principal.Reemplazando campos o propiedades en subclases
Quiero definirlo en la clase base para que pueda referenciarlo en un método de clase base, por ejemplo anulando ToString para decir "Este objeto es del tipo propiedad/campo". Tengo tres formas de hacerlo, pero me preguntaba: ¿cuál es la forma mejor o más aceptada de hacer esto? Pregunta de novato, lo siento
Opción 1:
uso de una propiedad de abstracta y anular en las clases heredadas. Esto se ve reforzado (tiene que anularlo) y está limpio. Sin embargo, se siente un poco mal devolver un valor de código duro en lugar de encapsular un campo y se trata de unas pocas líneas de código en lugar de solo. También tengo que declarar un cuerpo para "establecer", pero eso es menos importante (y probablemente haya una forma de evitar aquello de lo que no tengo conocimiento).
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
Opción 2
puedo declarar un campo público (o un campo protegido) y explícitamente anularlo en la clase heredada. El siguiente ejemplo me dará una advertencia para usar "nuevo" y probablemente pueda hacer eso, pero se siente mal y rompe el polimorfismo, que fue el punto. No me parece una buena idea ...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
Opción 3
puedo usar un campo protegido y establecer el valor en el constructor. Esto parece bastante ordenado, pero confío en que me asegure de que el constructor siempre establezca esto y con múltiples constructores sobrecargados siempre hay una posibilidad de que alguna ruta de código no establezca el valor.
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
Es un poco de una cuestión teórica y supongo que la respuesta tiene que ser la opción 1, ya que es la única opción segura pero yo soy más que llegar a enfrentarse con C# y quería preguntar esto de las personas con más experiencia.
Como un aparte, realmente creo que el ** Padre ** debe aplicar la fórmula "Y", y la Madre, lógicamente, "X". –