作为代码重构的一部分,我发现了一些正在尝试删除的代码副本
我有一个像下面这样的接口,在我无法修改的程序集中。
public interface IArtifact
{
void Accept(IArtifactVisitor visitor);
}
public interface IArtifactVisitor
{
void Visit(Topic topic);
}在我希望重用现有接口的引用程序集中,存在相同的函数签名。
public interface IArtifact
{
void Accept(IArtifactVisitor visitor);
}
public interface IArtifactVisitor
{
void Visit(Topic topic);
void Visit(NewTopic topic);
}“接受”看上去就像这样
public void Accept(IArtifactVisitor visitor)
{
visitor.Visit(this);
}为了删除代码重用,我尝试了以下方法:
public interface MyIArtifact : IArtifact
{
void Accept(MyIArtifactVisitor visitor);
}
public interface MyIArtifactVisitor : IArtifactVisitor
{
void Visit(NewTopic topic);
}但是它所做的是,它迫使我在每个实现类中实现接受(MyIArtifactVisitor访问者)和接受(IArtifactVisitor访问者)。
有更好的方法吗?
发布于 2016-04-29 21:22:30
访问者模式被搞砸了,而IMHO通过接口实现它是没有意义的。实现访问者模式的方式如下:
abstract class Artifact{
internal abstract void Visit(ArtifactVisitor visitor);
}
class Topic : Artifact{
internal override void Visit(ArtifactVisitor visitor)
{
visitor.Visit(this);
}
}
class ArtifactVisitor{
internal virtual void Visit(Artifact artifact)
{
artifact.Visit(this);
}
protected virtual void Visit(Topic topic)
{
}
}
class SomeSpecificTopicVisitor : ArtifactVisitor
{
protected override void Visit(Topic topic)
{
//do something with topics
}
}从这个状态,您可以开始从ArtifactVisitor继承您自己的访问者。您将只覆盖实际需要的方法。
访问者模式不是很可扩展。只有当一组继承者是固定的并且不会有很大的变化时,它才是有用的。不过,如果您使用得当,它将很好地解决您的双重调度问题。
发布于 2016-04-29 17:04:05
如果我正确理解了您的问题,您只需在您的接口中指定一个方法签名即可。
public interface MyIArtifactVisitor : IArtifactVisitor
{
void Visit(NewTopic topic);
}本质上就是这样。因此,如果您想要实现这一点和外部接口,那么您可以执行以下操作
public class MyImplimentingClass : MyIArtifactVisitor, IArtifactVisitor
{
public void Visit(NewTopic topic)
{}
public void Visit(Topic topic)
{}
}https://stackoverflow.com/questions/36943437
复制相似问题