Я обсуждал с коллегой, который настаивал на том, что в таких языках, как Java и C#, никогда не было причин использовать базовый класс Pure Abstract, поскольку это просто означает, что вы неспособность обойти отсутствие множественного наследования.Разница между чистым абстрактным классом и интерфейсом
Я чувствую, что он ошибается в этом, так как я всегда думал, что если вещь является существительным, то это объект, и если это глагол, то это интерфейс.
Например, если бы я хотел определить тип Bird
, где я хотел бы применить метод fly
без его реализации, тогда я бы сделал это чистым абстрактным классом.
Если бы я хотел определить тип Flies
, я бы сделал его интерфейсом по методу fly
.
Bird
способ реализации Flies
.
Я не прав?
EDIT:
Единственный твердый аргумент, который я могу дать, чтобы поддержать свою точку зрения, что в какой-то момент в будущем дизайн, возможно, потребуется изменить так, что птицы могут съесть. Если все птицы едят то же самое, то это нужно будет добавить к Bird
, делая его не чистым абстрактным.
Если бы Bird
был интерфейсом, это изменение было бы просто кошмаром, так как я не могу знать, реализуют ли вещи, которые унаследованы от какого-либо другого базового класса, мой интерфейс Bird
, поэтому я не могу просто реорганизовать свои проблемы.
+1 - хороший вопрос, и я думаю, что в грядущих ответах на использование абстрактных классов будет много разумных соображений. –
Просто набирайте * часть * вашего вопроса (таким образом, не отправляя * ответ *): Я бы не сказал, что интерфейсы всегда * глаголы * вообще. Интерфейсы используются * lot *, чтобы позволить классу показать лицо миру, которое лучше всего моделируется как существительное. Просто посмотрите на некоторые из интерфейсов в 'java.util':' Comparator', 'Enumeration',' List', 'Iterator',' Map', ... –
Мнения похожи на обратные, каждый получил один, а некоторые лучше чем другие.Я не верю, что сравнение ООП с грамматикой правильное, но оно близко. – Lloyd