2014-12-29 2 views
0

Это мой первый вопрос, поэтому, пожалуйста, не сердитесь на меня, если что-то не так.Инициализировать расширенный класс через фабрику базового класса в Java

В чем проблема: У нас есть класс Node. Это базовый класс для класса Item. Таким образом, в основном:

public class Item extends Node 

Хорошо, все в порядке. Но у нас также есть класс, назовем его NodeFactory, который содержит статический метод loadNodeAssets, возвращающий узел в результате.

public static Node loadNodeAssets (String path) 

В библиотеке, которую я использую, это только способ инициализировать класс узла и загрузить в него активы. Но главная проблема заключается в том, что мне нужно получить экземпляр класса Item, а не Node. Как я мог это сделать?

Item f = (Item)NodeFacory.loadNodeAssets ("...") 

Не работает с тех пор, как класс возврата имеет тип Узел, но не товар. В принципе мне нужно построить класс Fish и инициализировать унаследованные поля в классе Node, который расширяет класс Fish. Извините за мой английский. Надеюсь на вашу помощь. Спасибо!

+2

Ну, просто потому, что 'Item extends Node' не означает, что все' Nodes' являются 'Items' (правда, обратное было бы правдой), поэтому вы не можете автоматически вводить' Node' в 'Item' (это может быть любой другой объект, который вообще не похож на «Элемент»). Вместо этого вам может потребоваться скопировать необходимые поля (атрибуты) вручную или с помощью библиотеки сопоставления свойств – ochi

ответ

2

Во-первых, вы должны выяснить, какой класс вы фактически получаете обратно:

Node n = NodeFacory.loadNodeAssets ("...") 
System.out.println(n.getClass()); 

Если оказывается, чтобы быть Node то ваш единственный способ получить Item будет строить его вручную:

Node n = NodeFacory.loadNodeAssets ("...") 
Item i = new Item(); 
i.setAAA(n.getAAA()); 
i.setBBB(n.getBBB()); 

Если библиотека не позволяет построить Item с на всех, то есть только две возможности:

  1. Вы неправильно понимаете, как использовать библиотеку. Может быть, вы думаете, что вам нужен Item, но вам действительно нужен только Node.
  2. Дизайн библиотеки фиктивный. В этом случае вам, вероятно, следует искать альтернативы, или - если у вас есть исходный код - исправьте его самостоятельно.
Смежные вопросы