当前位置: 首页 > 知识库问答 >
问题:

泛型和访问者模式

狄宗清
2023-03-14

我对访问者模式和泛型有问题。我有一个抽象班,他们的孩子要去看望。查看此代码:

public abstract class Element extends SomeSuperClass {
    public void accept(Visitor<? extends Element> v) {
        v.visit(this);
    }
}

public interface Visitor<T extends SomeSuperClass> {
    void visit(T element);
}

因此,我的想法是:我有一些类层次结构(例如,元素某个超类的子类)。我有一些通用的访问者界面来访问这个层次结构。现在在这个层次结构的中间是元素类,它是抽象的,有自己的子类。

现在,我希望元素接受其子类的所有访问者,这就是为什么我写这行:

public void accept(Visitor<? extends Element> v)

但现在我收到错误:

类型<代码>访问者中的方法访问(<代码>捕获#1-of?扩展元素

我明白了?扩展元素不是元素。我的问题是:我能用不同的方式表达我的想法吗?或者我刚刚错过了这种情况下泛型的概念?

共有3个答案

辛健
2023-03-14

注意中的T

您拥有的代码调用访问者。访问(要素e),但所涉及的访客可能是访客

我认为“元素必须接受其子类的所有访问者”的要求没有意义:访问者必须至少能够访问元素及其所有子类。那将是一位访客

构造接受(访问者

石臻
2023-03-14

我认为你想做的没有多大意义。将访问者设置为泛型是无用的:accept()方法必须以特定的访问者接口为参数,这样元素的子类就可以调用visit()的特定重载。

interface Visitor {
  void visit(Element e);
  void visit(SubElement e);
}

class Element {
  public void accept(Visitor v) {
    v.visit(this);
  }
}

class SubElement { 
  public void accept(Visitor v) {
    v.visit(this);
  }
}

class ElementVisitor implements Visitor {
  public void visit(Element e) {}
  public void visit(SubElement e) {}
}

请注意,Visitor接口必须知道元素hyerarchy中需要自定义visit()实现的所有类。

袁法
2023-03-14

这不起作用-的访问者?扩展Element可能需要能够访问Element没有或不知道的数据(属性/方法,...)。

您不能让应该访问扩展Element的对象的访问者必须能够访问直接的Element或甚至另一个完全独立的Element子类。

 类似资料:
  • 主要内容:介绍,实现,ComputerPart.java,Keyboard.java,Monitor.java,Mouse.java,Computer.java,ComputerPartVisitor.java,ComputerPartDisplayVisitor.java,VisitorPatternDemo.java在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行

  • 亦称: Visitor 意图 访问者模式是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。 问题 假如你的团队开发了一款能够使用巨型图像中地理信息的应用程序。 图像中的每个节点既能代表复杂实体 (例如一座城市), 也能代表更精细的对象 (例如工业区和旅游景点等)。 如果节点代表的真实对象之间存在公路, 那么这些节点就会相互连接。 在程序内部, 每个节点的类型都由其所属的类来表示, 每个特定

  • 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 介绍 意图:主要将数据结构与数据操作分离。 主要解决:稳定的数据结构和易变的操作耦合问题。 何时使用:需要对一个对象结构中的对象进行

  • 简介 访问者模式是一种将算法与对象结构分离的软件设计模式。 这个模式的基本想法如下:首先我们拥有一个由许多对象构成的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象;访问者是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素作出不同的反应;在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施accept方法,在每一个元素的accept方

  • 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 介绍 意图:主要将数据结构与数据操作分离。 主要解决:稳定的数据结构和易变的操作耦合问题。 何时使用:需要对一个对象结构中的对象进行

  • 访问者模式 不知不觉当中,我们就到了最后一种设计模式,即访问者模式。访问者模式,听上去复杂一些。但是,这种模式用简单的一句话说,就是不同的人对不同的事物有不同的感觉。比如说吧,豆腐可以做成麻辣豆腐,也可以做成臭豆腐。可是,不同的地方的人未必都喜欢这两种豆腐。四川的朋友可能更喜欢辣豆腐,江浙的人就可能对臭豆腐更喜欢一些。那么,这种情况应该怎么用设计模式表达呢? typedef struct _Tof