首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口继承层次

接口继承层次
EN

Stack Overflow用户
提问于 2016-04-29 16:35:05
回答 2查看 74关注 0票数 0

作为代码重构的一部分,我发现了一些正在尝试删除的代码副本

我有一个像下面这样的接口,在我无法修改的程序集中。

代码语言:javascript
复制
public interface IArtifact
{
    void Accept(IArtifactVisitor visitor);
}

public  interface IArtifactVisitor
{
    void Visit(Topic topic);
}

在我希望重用现有接口的引用程序集中,存在相同的函数签名。

代码语言:javascript
复制
public interface IArtifact
{
    void Accept(IArtifactVisitor visitor);
}

public  interface IArtifactVisitor
{
     void Visit(Topic topic);
     void Visit(NewTopic topic);
}

“接受”看上去就像这样

代码语言:javascript
复制
public void Accept(IArtifactVisitor visitor)
{
    visitor.Visit(this);
}

为了删除代码重用,我尝试了以下方法:

代码语言:javascript
复制
public interface MyIArtifact : IArtifact
{
    void Accept(MyIArtifactVisitor visitor);
}

public interface MyIArtifactVisitor : IArtifactVisitor
{
    void Visit(NewTopic topic);
}

但是它所做的是,它迫使我在每个实现类中实现接受(MyIArtifactVisitor访问者)和接受(IArtifactVisitor访问者)。

有更好的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-29 21:22:30

访问者模式被搞砸了,而IMHO通过接口实现它是没有意义的。实现访问者模式的方式如下:

代码语言:javascript
复制
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继承您自己的访问者。您将只覆盖实际需要的方法。

访问者模式不是很可扩展。只有当一组继承者是固定的并且不会有很大的变化时,它才是有用的。不过,如果您使用得当,它将很好地解决您的双重调度问题。

票数 1
EN

Stack Overflow用户

发布于 2016-04-29 17:04:05

如果我正确理解了您的问题,您只需在您的接口中指定一个方法签名即可。

代码语言:javascript
复制
public interface MyIArtifactVisitor : IArtifactVisitor
{
     void Visit(NewTopic topic);
}

本质上就是这样。因此,如果您想要实现这一点和外部接口,那么您可以执行以下操作

代码语言:javascript
复制
public class MyImplimentingClass : MyIArtifactVisitor, IArtifactVisitor 
{
     public void Visit(NewTopic topic)
     {}

     public void Visit(Topic topic)
     {}
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36943437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档