Унаследовать два класса и реализовать из интерфейса отдельно - PullRequest
1 голос
/ 14 мая 2019

У меня есть абстрактный интерфейс BaseClass и IClass. Я создал два класса Class (в разных пространствах имен) и унаследовал от BaseClass. Имеет ли смысл реализовывать интерфейс в классах класса, но не в классе BaseClass?

1 Ответ

1 голос
/ 14 мая 2019

Не понимаю, почему нет; у подклассов могут быть разные реализации IClass, они просто соответствуют спецификации IClass. У вас может быть другая реализация Class, которая не реализует IClass, поэтому нет смысла заставлять BaseClass реализовывать ее (или абстрагировать) и навязывать ее всем своим дочерним элементам.

Это скорее дизайнерские решения, чем жесткие и быстрые правила, и они во многом зависят от пространства объектов, которое вы моделируете. Если что-то общее для всего класса, подумайте о том, чтобы сделать его частью базового класса. Если что-то является специализацией, которую демонстрируют только несколько Классов, сделайте это интерфейсом, чтобы к ним можно было относиться обычно для этой специализации

Предположим, вы создали набор коллекций (устройства хранения данных, такие как Очередь, Список и т. Д. - я выбираю их, потому что они обычно используются, понятны, и люди привыкли к тому, что они реализуют интерфейсы).

Вы решили, что все коллекции должны поддерживать добавление и удаление, но можно перечислить только некоторые из них. Add / Remove будут абстрактными методами базового класса, операции, связанные с перечислением, будут определены в интерфейсе. Не все конкретные подклассы базы реализуют интерфейс, и, следовательно, не все из них могут использоваться в других местах, которые объявляют «Я возьму все, что реализует перечисление»

...