2016-11-09 3 views
0

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

INode 

является один из них:

public interface INode { 

void buildString(StringBuilder builder, int tabs); 
} 

Мы должны реализовать этот интерфейс несколько раз.

BlockNode 

является один из них:

public class BlockNode implements INode { 

@Override 
public void buildString(StringBuilder builder, int tabs) { 
    } 
} 

Теперь моя проблема заключается в том, что в основной функции, которую они делают, что (тип синтаксического анализа является INode):

root = parser.parse(); 
builder = new StringBuilder(); 
builder.append("PARSE TREE:\n"); 
root.buildString(builder, 0); 

Я не» t получение, какая реализация

buildString(StringBuilder builder, int tabs) 

называется. Это может быть тот, который я написал выше (BlockNode)? или любой другой, который я реализовал? Я не понимаю, какой из них называется в первом ..

+1

Это зависит от того, какая реализация 'INode' возвращается' parse() ', конечно. Вы не можете сказать, проверив этот код. – EJP

+1

Не видя определения класса 'parser', чтобы увидеть, что' parse() 'возвращает, мы не можем вам сказать. Весь смысл использования интерфейсов заключается в том, что 'parse()' возвращает реализацию _ appro_, которая предоставляет необходимую функциональность, и вам действительно не нужно знать, какой из них. –

+0

Итак, если я верну реализацию реализации BlockNode в parse(), реализация, которая будет вызываться сначала, это BlockNode? –

ответ

1

- Это будет вызывать метод из BlockNode

INode root = parser.parse(); // Let's assume it return new BlockNode(); 
builder = new StringBuilder(); 
builder.append("PARSE TREE:\n"); 
root.buildString(builder, 0); 

- Это будет вызывать метод из SomeNode

INode root = parser.parse(); // Let's assume it return new SomeNode(); 
builder = new StringBuilder(); 
builder.append("PARSE TREE:\n"); 
root.buildString(builder, 0); 
0

Предположим, у нас есть класс Parser.

public Parser { 
    public INode parse(){ 
     return new BlockNode(); // this will return a new BlockNode. 
    } 
} 

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

void buildString(StringBuilder builder, int tabs); 

к:

String buildString(StringBuilder builder, int tabs); 

, а затем, когда вы реализуете его на своем классе узлов:

public class BlockNode implements INode { 
    public String buildString(StringBuilder builder, int tabs) { 
      return "BlockNode"; 
    } 
} 

or 

public class OtherNode implements INode { 
    public String buildString(StringBuilder builder, int tabs) { 
      return "OtherNode"; 
    } 
} 

Теперь, таким образом, вы можете отличить, какой тип возвращает, напечатав его.

root = parser.parse(); 
builder = new StringBuilder(); 
builder.append("PARSE TREE:\n"); 
String nameOfClass = root.buildString(builder, 0); 
System.out.println(nameOfClass); // this will identify what type is returned. 
Смежные вопросы