我的困境在于创建一种遵循构建器模式的方法,该方法设置一个变量并返回自身,但我有一个由其他访问者实现实现并扩展Visitor
的接口。BasicVisitor
此外,我有一个Visitable
接口,该接口由其实现SampleVisitable
并具有保留所有访问者历史记录的方法。
所以问题是我只想在访问者的历史记录中保留SampleVisitable
访问者是否“重要”的完整参考,因为主机Visitor.clean()
在访问者访问之前调用,这会清除上次访问的所有数据,但我想要“重要”访客的数据留在历史中。
这是我迄今为止的实施:
public interface Visitor {
public void visit( Visitable visitable );
public Visitor clone();
public <V extends Visitor> V important();
public boolean isImportant();
}
这是该SampleVisitable
课程的一个片段:
public void accept( Visitor visitor ) {
visitor.clean();
visitor.visit( this );
addToHistory( visitor ); // only adds if visitor.isImportant() == true
}
然后我有BasicVisitor
哪个实现了该important()
方法。现在我不想important()
每次都重写该方法,但是通过我的实现,我必须这样做,因为如果其他访问者使用该important()
方法,则会出现“无法从 BasicVisitor 转换为 [OtherVisitor]”形式的错误不覆盖它:
OtherVisitor otherVisitor = new OtherVisitor().important(); // cannot convert from BasicVisitor to OtherVisitor error.
做这个的最好方式是什么?我需要让这个特性实现一次,并且可供所有其他子类使用,而不需要它们覆盖它。谢谢!
编辑:
哇,抽象类正是我想要的!我做了更多研究,发现这篇关于接口和抽象类之间差异的帖子,我希望它可以帮助其他人寻找答案。
发布此答案后,我意识到在这种情况下我不必使用构建器模式,我可以创建一个setImportant( boolean isImportant )
并且基本上可以满足我的需要,但我很高兴我还是问了,因为这就是我需要另一个设计问题。
编辑2:
important()
在尝试了抽象类之后,我的主要问题仍然存在,我仍然需要重写Visitor
.
伊利亚