У мене є абстрактний базовий клас, і я хочу оголосити поле або властивість, яке матиме інше значення у кожному класі, який успадковується від цього батьківського класу.
Я хочу визначити його в базовому класі, щоб я міг посилатися на нього методом базового класу - наприклад, переосмисливши ToString, щоб сказати "Цей об'єкт має властивість / поле ". У мене є три способи, які я бачу робити це, але мені було цікаво - який найкращий чи прийнятий спосіб зробити це? Питання новачка, вибачте.
Варіант 1:
Використовуйте абстрактне властивість та замініть його на успадкованих класах. Це виграє від примусового виконання (ви маєте це перекрити), і це чисто. Але повернути значення жорсткого коду, а не інкапсулювати поле, вважається трохи неправильним, і це кілька рядків коду, а не просто. Я також повинен оголосити орган для "набору", але це менш важливо (і, мабуть, є спосіб уникнути того, про що я не знаю).
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
Варіант 2
Я можу оголосити загальнодоступне поле (або захищене поле) і явно перекрити його у спадок. Наведений нижче приклад подасть мені попередження використовувати "нове", і я, мабуть, можу це зробити, але це почувається неправильно, і це порушує поліморфізм, про який і було все. Це не здається гарною ідеєю ...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
Варіант 3
Я можу використовувати захищене поле і встановити значення в конструкторі. Це здається досить охайним, але покладається на мене тим, що конструктор завжди встановлює це, і при кількох перевантажених конструкторах завжди є ймовірність, що якийсь шлях коду не встановить значення.
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
Це трохи теоретичне запитання, і я думаю, що відповідь має бути варіантом 1, оскільки це єдиний безпечний варіант, але я просто стикаюся з C # і хотів би задати це людям з більшим досвідом.