Я новичок в разработке программного обеспечения, и я пытаюсь построить Tree, как структура.
У меня есть пустой интерфейс, подобный этому:
interface Node{
}
Два класса NodeA
и NodeB
реализовать этот интерфейс, и оба имеют определенные атрибуты c. За исключением того, что это узлы, в них нет ничего общего.
class A implements Node {
public String a;
public A(String a){
this.a = a;
}
}
class B implements Node {
public int a = 5;
public String z = "xyz";
public B(int a,String z){
this.a = a;
this.z = z;
}
}
У меня есть class Parse
, который создает экземпляры вышеуказанных классов в зависимости от определенных условий.
class Parse {
List<Boolean> l;
private static int i=0;
Parse(List<Boolean> l){
this.l = l;
}
private Node parseA() {
return new A(/* param */); // Assume some parameters here
}
private Node parseB() {
return new B(/* param */); // Assume some parameters here
}
private boolean getNextState(){
return l.get(i++);
}
public Node parse(){
boolean x = getNextState();
if(x){
return parseA();
}
else{
return parseB();
}
}
}
Класс драйвера:
public class Test {
public static void main(String[] args) {
List<Boolean> l = Arrays.asList(true,false); // so on...
Parse p = new Parse(l);
Node b = p.parse(); // not sure if its NodeA or NodeB
}
}
После построения дерева я планирую использовать шаблон посетителей для получения некоторых атрибутов и выполнения некоторых операций.
Итак, наконец, когда я получаю Node b
, я хочу получить доступ к его атрибутам (NodeA
или NodeB
), что, как я знаю, не может быть сделано, так как полиморфизм не работает таким образом.
Я думаю, что использование instanceof
лестниц и приведения типов не является правильным решением.
Извините за эту глупую проблему, но, будучи новичком в проектировании, я не понимаю, что делать дальше.
Как решить эту проблему? может ли кто-нибудь разделить небольшую структуру проекта для этого, предполагая, что эта структура будет расти больше и иметь множество различных узлов. [может быть Java Generics
помогите здесь]
Примечание: изменение вышеуказанного дизайна - это хорошо, но, если возможно, приветствуется небольшой пример кода.