Как создать полиморфное поведение, когда подклассы имеют дополнительные поля по сравнению с базовым классом?C#

Место общения программистов C#
Ответить
Anonymous
 Как создать полиморфное поведение, когда подклассы имеют дополнительные поля по сравнению с базовым классом?

Сообщение Anonymous »


Предположим, у нас есть следующая иерархия:
(Стоит отметить, что в примере используется регистр «Человек-Студент» просто для простоты)

класс Человек { общедоступная строка Имя; public int Возраст; публичная абстрактная пустота SayHello(); } Ученик класса: Человек { общественная двойная оценка; общедоступная строка SchoolName; публичное переопределение void SayHello() { Console.WriteLine("Привет! Я студент."); } } Может существовать множество других классов, которые являются подклассами Person.
С методической точки зрения принцип Лискова выполняется на 100%. Везде в коде, где я создаю экземпляр Student (или другой подкласс Person), будет вызываться соответствующий метод SayHello().
С точки зрения полей принцип Лискова совершенно не выполняется.
Следующий фрагмент кода не работает и мне кажется, что это плохой дизайн кода.

Person onePerson = новый студент(); Console.WriteLine(onePerson.Name); // ХОРОШО Console.WriteLine(onePerson.Age); // ХОРОШО Console.WriteLine(onePerson.Grade); // НЕ ОК — у человека нет поля «Оценка» Console.WriteLine(onePerson.SchoolName); // НЕ ОК – у человека нет SchoolName Мой вопрос: как я могу перепроектировать этот код, чтобы добиться какого-то полиморфного поведения? Совершенно разумно, чтобы подкласс содержал Grade и SchoolName, но это разрушает принцип Лискова. Я не могу получить доступ к полям подкласса, как я пытался в приведенном выше коде. Единственное решение — понизить значение, но это действительно плохая практика.

Я пытался найти различные шаблоны проектирования, но в моем случае ничего не подходило. Я также читал о наследственности и композиции, но не нашел ничего полезного.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»