Как создать полиморфное поведение, когда подклассы имеют дополнительные поля по сравнению с базовым классом? ⇐ C#
-
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, но это разрушает принцип Лискова. Я не могу получить доступ к полям подкласса, как я пытался в приведенном выше коде. Единственное решение — понизить значение, но это действительно плохая практика.
Я пытался найти различные шаблоны проектирования, но в моем случае ничего не подходило. Я также читал о наследственности и композиции, но не нашел ничего полезного.
Предположим, у нас есть следующая иерархия:
(Стоит отметить, что в примере используется регистр «Человек-Студент» просто для простоты)
класс Человек { общедоступная строка Имя; 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, но это разрушает принцип Лискова. Я не могу получить доступ к полям подкласса, как я пытался в приведенном выше коде. Единственное решение — понизить значение, но это действительно плохая практика.
Я пытался найти различные шаблоны проектирования, но в моем случае ничего не подходило. Я также читал о наследственности и композиции, но не нашел ничего полезного.
Мобильная версия