Проблема в наследовании в Java - PullRequest
2 голосов
/ 05 февраля 2010

У меня есть 5 разных таблиц в базе данных. Я написал абстрактный класс «Converter.java», который извлекает данные из базы данных и преобразует их в файл «tree.xml».

Tree.xml

<?xml version="1.0" standalone="no"?>
<tree>
   <declarations>
       <attributeDec1 name="name" type="String"/>
   </declarations>

   <branch>
       <attribute name="name" value="process 1"/>

       <leaf>
           <attribute name="name" value="process 2"/>
       </leaf>

       <leaf>
           <attribute name="name" value="process 3"/>
       </leaf>
   </branch>
</tree>

Итак, как вы можете догадаться, структура вышеуказанного tree.xml останется одинаковой для всех 5 таблиц. Единственная разница заключается в значении атрибута «значение».

Чтобы получить значение этого атрибута "value", преобразователь сначала должен запросить в базе данных эти значения.

Итак, должно быть 5 разных запросов для 5 разных таблиц. Поэтому вместо того, чтобы кодировать 5 разных конвертеров, я сделал отдельный конвертер "Converter.java", который имеет такие функции, как

  • openTree ()
  • closeTree ()
  • openBranch ()
  • closeBranc ()
  • openLeaf ()
  • closeLeaf ()
  • AddAttribute ()

Из вышеперечисленных методов я реализовал все методы, кроме метода addAttribute (), так как он будет иметь реализацию в зависимости от таблицы.

После этого я кодировал 5 разных конвертеров, каждый для одной таблицы, и все они расширяют "Converter.java"

Я создал поле с именем «query» в классе Converter.java. Поскольку это поле наследуется всеми 5 конвертерами, я инициализировал это поле в конструкторах этих 5 конвертеров.

Теперь мой вопрос таков:

Q. Я не уверен, правильно ли я использовал наследование или должны быть какие-то изменения в вышеуказанном подходе?

Edit:

Q2. У меня есть еще один метод в классе Converter.java, который использует поле «запрос». Поскольку поле не инициализировано в классе Converter.java, копирую ли я этот метод во все 5 дочерних преобразователей, или можно поместить этот метод в родительский класс (т. Е. Converter.java)

Ответы [ 3 ]

3 голосов
/ 05 февраля 2010

Я думаю, что модель Стратегии была бы более подходящей здесь. Вы можете создать неабстрактный класс Converter с обычным поведением и предоставить ему ValueSource, который может выполнять поиск значений для таблицы. Затем вы создаете QueryValueSource (подкласс ValueSource) для получения значения на основе указанного запроса.

Чтобы получить конкретные стратегии, вы можете либо передать различные запросы в конструктор QueryValueSource, либо создать его подкласс для создания специфичных для таблицы источников.

1 голос
/ 05 февраля 2010

Надеюсь, я правильно понимаю ваш вопрос. Если я это сделаю, то похоже, что вы непосредственно инициализируете поле, например, «mQuery = foo;» в каждом конструкторе? Если это так, то, вероятно, наилучшей формой было бы вместо этого инициализировать его только в конструкторе суперкласса, а затем вызывать этот конструктор суперкласса в каждом конструкторе подкласса, например «super (foo);».

0 голосов
/ 05 февраля 2010

Относительно вопроса Q2: что вы можете сделать, это сделать класс Converter абстрактным и обеспечить реализацию метода, который использует в нем атрибут «query». Иметь конструктор подклассов Converter для инициализации атрибута запроса.

Что касается Q1, я не могу полностью понять вопрос в контексте, который вы предоставили. Может быть, поможет пример кода. Но с этим ограниченным пониманием я могу предположить, задумывались ли вы о том, помогло бы использование композиции вместо наследования? Также мне кажется, что здесь можно использовать шаблон Strategy .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...