![](/img/trans.png)
[英]GetProperties() to return all properties for an interface inheritance hierarchy
[英]Interface inheritance hierarchy
作为代码重构的一部分,我发现了一些我要删除的重复代码
我有一个类似于下面的界面,在我无法修改的程序集中。
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);
}
但这是什么,它迫使我在每个实现类中实现Accept(MyIArtifactVisitor visitor)和Accept(IArtifactVisitor visitor)
有一个更好的方法吗?
如果我正确理解了您的问题,则只需在界面中指定一个方法签名
public interface MyIArtifactVisitor : IArtifactVisitor
{
void Visit(NewTopic topic);
}
基本上就是这样。 因此,如果您想隐含该信息以及外部接口,则可以执行以下操作
public class MyImplimentingClass : MyIArtifactVisitor, IArtifactVisitor
{
public void Visit(NewTopic topic)
{}
public void Visit(Topic topic)
{}
}
访问者模式搞砸了,恕我直言,通过接口实现它是毫无意义的。 实现访问者模式的方式如下:
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继承您自己的访问者。 您将只覆盖您实际需要的方法。
访客模式不是很可扩展。 仅当继承者集是固定的并且不会发生重大变化时,此选项才有用。 但是,如果正确使用它,它将很好地解决您的双重调度问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.