Итак, гипотетически, я строю своеобразное приложение для недвижимости на C#. Для каждого типа свойств я собираюсь создать класс, такой как ResidentialProperty и CommercialProperty. Эти два класса, а также все другие классы свойств будут иметь общие свойства, такие как идентификатор, название, описание и адрес.C# - Что я должен использовать, интерфейс, абстрактный класс или оба?
То, что я хотел бы быть в состоянии сделать это:
а) возвращает коллекцию объектов, которые содержат только основную информацию
б) иметь возможность либо вызвать метод, как GetProperty (идентификатор), который будет создавать и возвратите либо ResidentialProperty, либо CommercialProperty, или вызовите GetProperties(), который вернет коллекцию того или другого или обоих.
Таким образом, было бы целесообразно создать абстрактный класс под названием BasicProperty (или PropertyBase), который содержит все общие атрибуты, и из него будут распространяться ResidentialProperty и CommercialProperty. Это позаботится о проблеме №1, поскольку я мог бы создать метод, который возвращает коллекцию BasicProperties.
Но для # 2, имея возможность вернуть либо один тип свойства, либо другой, мне нужен интерфейс (IProperty), и у него наследуются жилые и коммерческие классы, а затем GetProperty (id) и GetProperties() возвращает объект IProperty (или потому, что они наследуют от IProperty, могу ли я вернуть их как есть, а не как интерфейс?)?
Теперь, если я должен использовать интерфейс, что мне делать с классом BasicProperty?
- Я оставляю его как абстрактный и реализую интерфейс? Или
- Я оставляю его как абстрактный, и все 3 класса реализуют интерфейс? Или
- Не создавайте ли я его как абстрактный, помещаем всю основную информацию в интерфейс, а BasicProperty, ResidentialProperty и CommercialProperty реализуют интерфейс?
Заранее спасибо, Carl J.
Итак, если я говорю, что тип возвращаемого метода - это PropertyBase (абстрактный класс), я могу затем вернуть либо Живой, либо Коммерческий объект? Я думал, что для того, чтобы метод мог возвращать разные типы, каждый тип должен был реализовать интерфейс. –
yep, см. Мой пример, который я добавил – Mark
Да, вы можете вернуть базовый класс и рассматривать как Residental, так и Commercial как общий набор базовых объектов. Это то, что известно в языке ООП как LSP, или в принципе Liskov Substitution, и в основном это означает, что если вы наследуете что-то, тогда его можно рассматривать как как конкретный подкласс, так и (возможно, абстрактный) базовый класс. Наследование - это «IS A». A ResidentialProperty * IS A * PropertyBase. Коммерческая недвижимость * IS A * PropertyBase. –