Если класс расширяет другой класс, можно ли инициализировать расширенный класс, а не расширять его?

#java

#java

Вопрос:

Если класс расширяет другой класс, можно ли инициализировать расширенный класс, а не расширять его?

Пример 1:

 public class FoodListAdapter extends BaseAdapter{
    //rest of the codes in here
}
  

Пример 2:

 public class FoodListAdapter {
    private BaseAdapter fAdapter;
    //rest of the codes here
}
  

Может ли Example2 дать результат, аналогичный результату Example1?

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

1. Один называется отношением is-a . Другой называется отношением has-a .

Ответ №1:

Обе стратегии хороши. Это зависит от того, чего вы пытаетесь достичь.

Первый пример — наследование, а второй — делегирование.

Оба являются хорошо известными шаблонами проектирования.

https://en.m.wikipedia.org/wiki/Delegation_pattern

Ответ №2:

Пример 1 — наследование.

Примером 2 является агрегация, направленная односторонняя ассоциация, представляющая отношение «Имеет».

Пример 1 более хрупкий, поскольку он напрямую предоставляет пользователям доступ к базовому BaseAdapter классу. Пример 2 может инкапсулировать и делегировать вызовы BaseAdapter . Если однажды вы решите удалить BaseAdapter , пользователи FoodListAdapter класса никогда не узнают.

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

1. Пожалуйста, если example2 возможен, как он будет кодироваться с использованием BaseAdapter?

2. Как вы уже сделали, просто передайте BaseAdapter с помощью конструктора или метода setter .