Eu tenho uma classe base abstrata e quero declarar um campo ou uma propriedade que terá um valor diferente em cada classe que herda dessa classe pai.
Eu quero defini-lo na classe base para que eu possa referenciá-lo em um método de classe base - por exemplo, substituindo ToString para dizer "Este objeto é do tipo propriedade / campo ". Eu tenho três maneiras que eu posso ver para fazer isso, mas eu estava pensando - qual é a melhor ou mais aceita maneira de fazer isso? Pergunta para iniciantes, desculpe.
Opção 1:
use uma propriedade abstrata e substitua-a nas classes herdadas. Isso se beneficia ao ser aplicado (é necessário substituí-lo) e é limpo. Mas, parece um pouco errado retornar um valor de código rígido em vez de encapsular um campo e são algumas linhas de código em vez de apenas. Eu também tenho que declarar um corpo como "definido", mas isso é menos importante (e provavelmente existe uma maneira de evitar aquilo de que não estou ciente).
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
Opção 2
Posso declarar um campo público (ou um campo protegido) e substituí-lo explicitamente na classe herdada. O exemplo abaixo me dará um aviso para usar "novo" e provavelmente posso fazer isso, mas parece errado e quebra o polimorfismo, que era o ponto principal. Não parece uma boa ideia ...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
Opção 3
Eu posso usar um campo protegido e definir o valor no construtor. Isso parece bem arrumado, mas depende de eu garantir que o construtor sempre defina isso e com vários construtores sobrecarregados, sempre haja uma chance de que algum caminho de código não defina o valor.
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
É um pouco de uma questão teórica e acho que a resposta deve ser a opção 1, pois é a única opção segura, mas estou começando a entender o C # e queria perguntar isso a pessoas com mais experiência.