繁体   English   中英

接口继承层次结构

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM