2013-02-17 2 views
1

У меня есть путаница в разных способах создания объектов, которые я видел в java-документах и ​​других книгах по программированию. Напр.Объектно-ориентированный дизайн: что лучше?

Если предположить, что существует base class и derived class

1- У меня есть переменная типа Base которая относится к объекту типа Derived

List<String> list = new ArrayList<String>(); 

2- У меня есть переменная типа Derived которой относится к объекту типа Derived

ArrayList<String> arrList = new ArrayList<String>(); 

Мой вопрос заключается в том, что должно быть моим мышлением при выборе между 1 и 2? Использовать ли вообще Polymorphism базовые сценарии?

Есть ли better practice при выборе между 1 и 2, о которых я не знаю, или это просто personal decision?

EDIT:

К сожалению, список представляет собой интерфейс. Другой вопрос: Будет ли изменено мое решение, если я использую параметр типа?

ArrayList<T> list = new ArrayList<T>(); 

Update Ответ: Это на самом деле называется "Programming to the interface". Спасибо Code-Guru. Именно то, что я искал, объясняется в очень простых условиях в одном из ответов на этот вопрос - What does it mean to "program to an interface"?

+2

Вариант 1 обычно предпочтительнее (игнорируя разницу между абстрактным базовым классом и интерфейсом). В ООП мы называем это «программирование интерфейсом». –

+0

Извините. См. Другой вопрос, отредактированный. – Prince

+1

Я по-прежнему предлагаю вам объявить 'list' как' List ', а не 'ArrayList '. Изменение параметра типа не приводит к существенному изменению исходного вопроса. –

ответ

4
  1. List не является базовым классом это interface и поэтому должны использоваться везде, где это возможно.

    Использование интерфейса, реализуемого классом, позволяет работать со всеми классами, реализующими интерфейс, а не только с определенным классом.

  2. String - это конкретный класс, поэтому его гораздо проще использовать.

    Иногда, хотя String использует интерфейс CharSequence, нет необходимости использовать CharSequence, потому что это просто сбивает с толку. Однако взгляните на StringBuilder, он использует только CharSequence почти исключительно.

В итоге - нет лучше есть только соответствующий.

+0

Итак, 1 предпочтительнее, но когда целесообразно использовать случай 2? См. Мой другой вопрос, отредактированный. – Prince

+0

@Prince - Уместно использовать 'String', когда' CharSequence' просто усложнит. – OldCurmudgeon

+0

Я не понимаю вашего объяснения для '2'. Когда это будет запутать? Когда я должен работать только с классом ArrayList? – Prince

3

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

1

В случае, когда список является класс (только предположим, с целью ответить на Ваш вопрос - «Будем ли мы использовать объект класса Parent, представляющий дочерний класс или использовать объект производного класса типа (actula класс)?»

1) Вы были правы, его исключительно для полиморфизма.

2) В основном используется для передачи объекта вокруг различных методов класса. Методы других классов могут принимать родительский класс за вход. вы должны использовать кастинг в этих местах.