Вы можете использовать наследование, чтобы сделать это, см., Например: https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
Короткий пример будет выглядеть примерно так:
abstract class Visitor{
public void sharedMethod() {
//Do something
}
public abstract void visitSimpleObject();
}
class SimpleVisitor extends Visitor{
@Override
public void visitSimpleObject() {
System.out.println("Simple Start:");
}
}
class ComplexVisitor extends Visitor{
@Override
public void visitSimpleObject() {
System.out.println("Simple within Complex:");
}
}
В этом случае оба ваших посетителя будут расширяться оттот же суперкласс (посетитель), где находится общий код.Оба подкласса могут определять свое собственное поведение.Суперкласс сам может также расширить посетителя другого типа (или реализовать интерфейс).
РЕДАКТИРОВАТЬ
После комментариев может быть больше похоже на это:
Пример Ex.g4: грамматикаПример;
START_COMPLEX : 'complex';
START_SIMPLE : 'simple';
SEPERATOR : ':';
TEXT : [A-Za-z]+;
simple : START_SIMPLE ' ' SEPERATOR ' ' TEXT;
complex : START_COMPLEX ' ' SEPERATOR ' ' TEXT;
И пример кода:
public class Example{
abstract class Visitor extends ExBaseVisitor<String>{
@Override
public String visitComplex(ExParser.ComplexContext ctx) {
System.out.println("Visiting complex");
return "";
}
}
class SimpleVisitor extends Visitor{
@Override
public String visitSimple(ExParser.SimpleContext ctx) {
System.out.println("Visiting Simple! " + ctx.TEXT());
return "";
}
}
class ComplexVisitor extends Visitor{
@Override
public String visitSimple(ExParser.SimpleContext ctx) {
System.out.println("Visiting Simple, from within complex! " + ctx.TEXT());
return "";
}
}
public static void main(String[] args) {
String text = "simple : hi";
CharStream charStream = new ANTLRInputStream(text);
ExLexer exLexer = new ExLexer(charStream);
TokenStream tokenStream = new CommonTokenStream(exLexer);
ExParser exParser = new ExParser(tokenStream);
ComplexVisitor complexVisitor = new Example().new ComplexVisitor();
complexVisitor.visit(exParser.simple());
String text2 = "simple : hmmmmm";
CharStream charStream2 = new ANTLRInputStream(text2);
ExLexer exLexer2 = new ExLexer(charStream2);
TokenStream tokenStream2 = new CommonTokenStream(exLexer2);
ExParser exParser2 = new ExParser(tokenStream2);
SimpleVisitor simpleVisitor = new Example().new SimpleVisitor();
simpleVisitor.visit(exParser2.simple());
}
}
Для меня это печатает:
Посещение Простое, изнутри сложное!привет
В гостях просто!хммммм
Общий код теперь называется visitComplex, что, возможно, немного глупо, но для примера, возможно, все в порядке.