У меня есть этот вид таблицы strucutre:посетителей Узор: различные способы, чтобы посетить ту же самую структуру
public class Table : IVisitable
{
public List<Row> rows;
public void accept(IVisitor visitor)
{
foreach(Row row in rows)
row.accept(visitor);
visitor.visit(this);
}
}
public class Row : IVisitable
{
public List<Cell> columns;
public void accept(IVisitor visitor)
{
foreach(Cell cell in columns)
cell.accept(visitor);
visitor.visit(this);
}
}
public class Cell : IVisitable
{
public void accept(IVisitor visitor)
{visitor.visit(this);}
}
синтаксический анализатор будет создавать объект этого класса, так что я своего рода ручной привязал о расширении классов или что-то вроде этого (но я мог бы пересмотреть, что перед хорошим решением).
Теперь, как вы можете увидеть метод accept()
который я реализовал визит весь стол, но теперь я хочу, чтобы определить посетителя, который посетить только первые 2 строки таблицы. Как я могу это сделать без добавления другого accept()
?
ОБНОВЛЕНИЕ: Я думал об этом решении, и я хотел бы получить ваше мнение. Не переписывая весь код выше, просто представьте, что каждый класс не реализует интерфейс IVisitable (и поэтому no accept() для каждого класса). Как создать два класса, которые расширяют таблицу? Что-то вроде этого:
public class VisitTwoRowTable : Table,IVisitable
{
public VisitTwoRowTable(Table table)
{
foreach(Row row in table.rows)
this.rows.add(row);
}
public void accept(IVisitor visitor)
{
for(int i=0;i<2;i++)
row[i].accept(visitor);
visitor.visit(this);
}
}
И это еще один:
public class VisitWholeTable : Table,IVisitable
{
public VisitWholeTable(Table table)
{
foreach(Row row in table.rows)
this.rows.add(row);
}
public void accept(IVisitor visitor)
{
foreach(Row row in rows)
row.accept(visitor);
visitor.visit(this);
}
}
Единственный ДЕЙСТВИТЕЛЬНО UGLY вещь этого решения является конструктором часть, где он создает копию (неполную копию)
Это одно из лучших решений, которое у меня было слишком много до сих пор, но это не лучшее решение с точки зрения производительности, но если ничего лучше не выйдет, я думаю, что я пойду с этим. – justHelloWorld
В любом случае, я просто добавил раздел UPDATE, может быть, вы могли бы взглянуть на него;) – justHelloWorld
Подкласс для реализации интерфейса 'IVisitable' кажется мне очень уродливым. Не могли бы вы уточнить, были ли проблемы с производительностью с моим решением? В любом случае, вы уверены, что вам действительно нужен шаблон посетителя здесь? – sloth