Я экспериментировал с некоторыми простыми классами 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()
вызывается явно или неявно в первой строке расширяющих классов. Таким образом, он как-то не чувствует себя правильно, что нужно делать с дизайнерской точки зрения, и я надеялся попросить совета относительно того, как это лучше всего подойти.
Вызов переопределяемых методов из конструктора не является хорошей идеей: метод в подклассе будет вызываться на объект, который еще не сконструирован. –
спасибо, хотя это звучит неправильно по причинам, включая это. – manOf
Может кто-нибудь, возможно, посоветует мне, как мне его переделать? Все эти классы должны вызвать этот метод. Почему, поскольку они являются методами, связанными с составлением объекта, я немного смущен, так как я ожидаю, что это поведение будет вызвано из какого-то конструктора где-то внутри иерархии? – manOf