相关疑难解决方法(0)

访客模式中accept()方法的重点是什么?

关于将算法与类分离的讨论很多.但是,有一件事没有解释.

他们像这样使用访客

abstract class Expr {
  public <T> T accept(Visitor<T> visitor) {visitor.visit(this);}
}

class ExprVisitor extends Visitor{
  public Integer visit(Num num) {
    return num.value;
  }

  public Integer visit(Sum sum) {
    return sum.getLeft().accept(this) + sum.getRight().accept(this);
  }

  public Integer visit(Prod prod) {
    return prod.getLeft().accept(this) * prod.getRight().accept(this);
  }
Run Code Online (Sandbox Code Playgroud)

Visitor不会直接调用visit(element),而是要求元素调用其visit方法.它与所宣称的关于访客的阶级无意识的观念相矛盾.

PS1请用您自己的话解释或指出确切的解释.因为我得到的两个回答是指一般的和不确定的.

PS2我的猜测:由于getLeft()返回基本Expression,调用visit(getLeft())将导致visit(Expression),而getLeft()调用visit(this)将导致另一个更合适的访问调用.因此,accept()执行类型转换(也称为转换).

PS3 Scala的模式匹配=类固醇上的访客模式显示没有接受方法访问者模式的简单程度.维基百科补充说:通过链接一篇论文,显示" accept()当反射可用时,方法是不必要的;为该技术引入术语'Walkabout'."

design-patterns visitor

77
推荐指数
2
解决办法
2万
查看次数

在java中使用Upcasting有什么需要?

我已经浏览了网上的大部分论文,但我仍然无法理解,为什么我们必须使用upcasting.

class Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Animal");
    }
}

class Dog extends Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Dog");
    }

    public void callme2()
    {
        System.out.println("In callme2 of Dog");
    }
}

public class UseAnimlas 
{
    public static void main (String [] args) 
    {
        Dog d = new Dog();      
        Animal a = (Animal)d;
        d.callme();
        a.callme();
        ((Dog) a).callme2();
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以将此示例视为向上转换.在这里使用向上转换有什么用?两者da给出相同的输出!

java

15
推荐指数
4
解决办法
3万
查看次数

标签 统计

design-patterns ×1

java ×1

visitor ×1