2016-06-29 1 views
2

Я экспериментировал с некоторыми простыми классами Swing, и я наткнулся на вопрос о том, как лучше всего организовать вызовы методам, реализованным в конкретных классах, реализующих абстрактные классы.Как организовать вызов и определение класса абстрактных классов Java abstract и полиморфных методов

В настоящее время у меня есть самый старший родитель из небольшой иерархии абстрактных классов и конкретных классов, вызывающих абстрактный (на уровне верхнего и второго уровня) addComponents() метод классов, предназначенных как дети этой иерархии. Это дало запрос о том, где следует определять и вызывать такой метод, поскольку целью этого было поместить определение такого метода в классы, которые расширяют дочерние элементы иерархии.

Иерархия выглядит следующим образом:

public abstract class AbstractFieldPanel extends JPanel 

public abstract class BorderedFieldPanel extends AbstractFieldPanel 

public class ExampleDataPanel extends BorderedFieldPanel 

public class FieldPanel extends AbstractFieldPanel 

Я хотел бы уточнить детали, какие компоненты должны быть добавлены в классах, которые проходят BorderedFieldPanel и AbstractFieldPanel в реализации ранее abstract addComponents() методы.

Вызов к addComponents() mehtod, таким образом, abstract, где она определена в BorderedFieldPanel и AbstractFieldPanel.

Конкретные реализации метода addComponents() находятся в ExampleDataPanel и FieldPanel, которые были предполагаемыми примерами их использования.

Вопрос: есть ли я был прав по полиморфным причинам, чтобы поместить вызов абстрактным методам в конструктор самого высокого класса в иерархии AbstractFieldPanel, или он должен быть вызван из конструктора самого низкого класса в иерархии?

Первоначально я предполагал, что это хорошо OO дизайн, используя наследование и полиморфные свойства и делегирование абстрактных классов.

Хотя, если это правильно, это должно представлять проблемы (в некоторых случаях) при рассмотрении того, что конструктор super() вызывается явно или неявно в первой строке расширяющих классов. Таким образом, он как-то не чувствует себя правильно, что нужно делать с дизайнерской точки зрения, и я надеялся попросить совета относительно того, как это лучше всего подойти.

+0

Вызов переопределяемых методов из конструктора не является хорошей идеей: метод в подклассе будет вызываться на объект, который еще не сконструирован. –

+0

спасибо, хотя это звучит неправильно по причинам, включая это. – manOf

+0

Может кто-нибудь, возможно, посоветует мне, как мне его переделать? Все эти классы должны вызвать этот метод. Почему, поскольку они являются методами, связанными с составлением объекта, я немного смущен, так как я ожидаю, что это поведение будет вызвано из какого-то конструктора где-то внутри иерархии? – manOf

ответ

0

Если вы хотите, чтобы эти компоненты были добавлены при создании объекта, вы можете сделать их аргументом в конструкторе AbstractFieldPanel (вместо конструктора no-args). Это означало бы, что конструкторы подклассов должны были бы вызвать super(components), передавая коллекцию объектов компонента в конструктор суперкласса. Тогда AbstractFieldPanel фактически добавит компоненты, которые ему были предоставлены.

0

Так как я предпочел бы композицию над наследованием, почему бы не иметь интерфейс, который содержит addComponents() и у вас есть бетон классы реализуют это?

Предупреждение, личное мнение
абстрактные классы (для меня) кода запаха, так как он в основном используется для хранения кода DRY в подклассах, создавая искусственные, нефункциональные классы ("какова цель этого класса, какие делает это? Абстрактный класс ничего не делает, ничего не может сделать, поскольку он не является полным. ').Сложнее тестировать, приводит к дублированию тестов (методы тестируются из всех подклассов, а не только один раз). Конечно, есть случаи, когда это действительно полезно, но я предпочитаю свободно связанный код, поэтому его легче протестировать.

Смежные вопросы