С точки зрения набора текста разницы нет. (Если вы специально не «ищете», используя отражение для самоанализа типов во время выполнения...)
С точки зрения производительности во время выполнения разницы нет. (За исключением некоторых возможных очень незначительных различий во времени загрузки классов... которые можно игнорировать во всех реальных случаях использования.)
С точки зрения реализации кода у этих двух подходов есть свои преимущества и недостатки:
Если вы используете только суперклассы (без интерфейсов), вы сможете написать меньше кода. Но обратная сторона заключается в том, что ваш код менее гибкий:
Вы пытаетесь использовать внешний API для реализации таким образом, что это ограничивает вашу способность писать новые реализации. Класс java.io.OutputStream
является классическим примером этого. Поскольку это класс, вам нужно создать подкласс, чтобы реализовать новый тип потока, и вы можете обнаружить, что вам нужно закодировать подкласс, чтобы переопределить всю инфраструктуру, которую вы «наследуете».
Тот факт, что у класса может быть только один суперкласс, еще больше ограничивает вас древовидной иерархией API.
Клиенты должны быть закодированы в соответствии с API-интерфейсами класса реализации в большей степени... потому что это все, что есть. И это ограничивает возможность программиста передумать.
Итог: если конкретный вариант использования не требует от вас возможности делать эти вещи (сейчас или в будущем), то использование интерфейсов не имеет смысла. Но немногие варианты использования действительно похожи на это. И дополнительные усилия по реализации использования интерфейсов невелики.
Должен добавить, я не спрашиваю, использовать интерфейсы или нет. Я предполагаю, что интерфейсы можно использовать только для того, чтобы заставить кого-то реализовать методы (и никогда не объявлять их как тип)?
Ну да. Но то же самое можно сказать и об абстрактных методах. Это не реальный смысл использования интерфейсов. Суть в том, что интерфейсы:
- разрешить более богатые иерархии типов, которые возможны с использованием классов, и
- позволяют писать клиентский код независимо от классов реализации.
Я просто спрашиваю, какие преимущества дает использование интерфейсов в качестве типа объекта для полиморфизма?
Из уровней набора и производительности: нет - см. выше.
Думаю, вы могли бы возразить, что если вы используете интерфейсы способом, выходящим за рамки иерархии реализации, то у вас больше гибкости на уровне клиента. Я думаю, вы могли бы назвать это "преимуществом полиморфизма". (Напротив, если иерархия вашего интерфейса точно отражает иерархию классов реализации, то вы, вероятно, ничего не достигли... по крайней мере, с точки зрения написанного кода.)
Однако полиморфизм является средством достижения цели, а не самоцелью, поэтому я бы сказал, что спрашивать о "преимуществах полиморфизма" в абстрактном смысле не стоит. Суть в том, чтобы проектировать и реализовывать программы таким образом, чтобы это имело смысл и приводило к созданию кода, пригодного для сопровождения.
person
Stephen C
schedule
14.07.2012