Страницы

Поиск по вопросам

четверг, 14 февраля 2019 г.

Класс возвращает тип имплементируемого интерфейса. Зачем?

В одном пакете находятся Vector - interface и Vect - class. Причем класс имплементирует интерфейс. А в классе есть методы, которые возвращают тип Vector, то есть интерфейса. Какой в этом смысл?


Ответ

Чтобы не завязываться на конкретную реализацию. Отчасти это принцип инкапсуляции. За счёт использование интерфейса в возвращаемом методе, тот, кто будет использовать класс, будет обращать внимание только на интерфейс, ему не важна реализация оного. Это уменьшает связанность компонентов.
К примеру:
public interface Vector{ public Vector rotateAndReturn(); public Vector somethingAndReturn();
[...] }
public class Vect implement Vector{ public Vector rotateAndReturn(){ // поворачиваем return this; }
public Vector somethingAndReturn(){ // что-то делаем return this; } }
Зачем? Смысл появится, когда, к примеру, новую реализацию Vector захотите делать:
public class SuperVect implement Vector{ public Vector rotateAndReturn(){ // поворачиваем return this; }
public Vector somethingAndReturn(){ // что-то делаем return this; } }
Теперь можно так:
Vector vector = new Vect(); vector1.rotateAndReturn().somethingAndReturn();
Можно тогда экземпляр другого класса создать и так же вызывать:
vector = new SuperVect (); vector1.rotateAndReturn().somethingAndReturn();
Плюшка в использовании коллекции:
List list = new ArrayList(); list.add(new Vect()); list.add(new SuperVect ());
Теперь при прогонке мы с классами можем унифицировано работать:
list.forEach(vector -> vector.rotateAndReturn().somethingAndReturn());
Независимо от того, какой это объект на самом деле, за счёт того, что методы возвращают имплементируемый интерфейс, мы работаем с классами унифицировано.

Комментариев нет:

Отправить комментарий