К сожалению, контрольно-пропускной пункт, который вы преодолели, слишком типичен для научных кругов. Академические проекты, как правило, начинаются с магазинов видеопроката, библиотек или систем регистрации студентов (ваша разница с кабинетом врача), а затем наследование преподается с животными. Указанное вами руководство также очень типично
они рекомендуют подумать о том, что объект может сделать для своего метода и каковы его обязанности для его атрибутов
На самом деле, когда начинающие спрашивают, я обычно объясняю, что свойство объекта - это то, что он знает о себе, а его методы - это то, что он знает, как делать. Что на самом деле просто еще один способ точно сказать, что у вас там. Как вы обнаружили, этот способ мышления быстро ломается, когда вы начинаете обсуждать более осязаемые системы, а не только примеры.
Например, руководство хорошо работает с этим объектом:
public class Tree
{
public int Height { get; set; }
public void Grow(int byHowMuch)
{
Height += byHowMuch;
}
}
Хотя это, безусловно, отвечает всем требованиям, вы имеете право думать, что это «не правильно»:
public class Secretary
{
public void MakeAppoinment(Patient patient)
{
//make the appointment
}
}
Так в чем же решение? Дело в том, чтобы взять то, чему вас учат, и применить это. Изучение и понимание шаблонов проектирования очень поможет в разработке систем, которые более функциональны, чем дерево, которое знает, как расти.
Рекомендуемое чтение:
Чтобы решить проблему, с которой вы столкнулись, я бы, вероятно, использовал бы комбинацию унаследованных классов лиц и интерфейсов, которые выполняли бы их действия через серию классов обслуживания. По сути, секретарь, врач и пациент все наследуют от человека, и каждый из этих классов может быть передан в сопутствующие классы обслуживания. Классы обслуживания могут или не могут делать такие вещи, как SeePatient()
. Пожалуйста, не используйте этот пример для обозначения того, что у индивидуальных классов не было бы методов.
Переполнение стека имеет несколько связанных вопросов, которые могут быть полезны:
Дополнительно было бы неплохо проверить:
Наконец, нет единого определения того, что делает объект приложения ориентированным. То, как вы применяете шаблоны, принципы и т. Д., Определит вашу программу. Тот факт, что вы задаете себе эти вопросы, показывает, что вы на правильном пути.