微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

instanceof对多态

如何解决instanceof对多态

| with0运算符给我带来了麻烦。我正在努力避免这种情况。基本上,我具有以下结构:
class Shape {}
class Triangle extends Shape {}
class Rectangle extends Shape {}

ShapeParser s;
while (s.hasNext())
     parseShape(s.next()); // returns a Shape object

void parseShape(Triangle t) { // do stuff } // KEY POINT HERE
void parseShape(Rectangle t) { // etc }
我要说明的重点是:我想对该函数进行参数重载,但是它没有按我的预期工作(编译错误)。我试图避免:
void parseShape(Shape s)
{
     if (s instanceof Triangle) ...
}
更新:似乎共识是创建一个基类方法:parseShape()做 起重。我想澄清一下我的问题:这个问题的动机与观察者模式有关。假设我有以下Observer对象有效负载方法
    public void update(Observable obj,Shape objectPayload){} 
// note: the objectPayload is usually of type Object
而不是执行:
public void update(Observable obj,Shape objectPayload)
{
       if (objectPayload instanceof Triangle)
          // do stuff
       else if (objectPayload instanceof Rectangle)
          // etc
}
我想要做
public void update(Observable obj,Shape objectPayload)
{
       parseShape(objectPayload);
}

    void parseShape(Triangle t) {  } // do stuff
    void parseShape(Rectangle t) { }
    

解决方法

您可以将ѭ6移到每个Shape类中。或者,您可以使用“访客”模式。该线程的解决方案中有一个巧妙的方法,它具有反射功能,可以避免Java中完整访问者模式的复杂性。 更新: 这是访客模式的秘诀: 声明一个接口: 公共接口ShapeVisitor {     visit(三角形);     visit(Rectangle);     // ... } 在
Shape
中,声明一个抽象方法
acceptVisitor
: 类Shape {     公共抽象无效acceptVisitor(ShapeVisitor visitor); } 在每个具体的类中,实现
acceptVisitor
: 类Triangle扩展Shape {     public void acceptVisitor(ShapeVisitor visitor){         visitor.visit(this);     } } 声明您的
ParseVisitor
类以实现ѭ​​11ѭ并实现所有必需的方法(只需将每个
parseShape
方法重命名为
visit
)。 这样做的好处是,首先,它将解析代码保留在Shape层次结构之外,并将其集中在单独的解析类中。第二,如果您以后决定需要执行其他操作(例如渲染),则可以应用相同的图案而无需更改任何Shape类。这种方法最大的缺点是,如果决定添加另一个
Shape
子类,则必须更改所有实现
ShapeVisitor
的类。     ,如果在
Shape
中声明了
parseShape()
方法,则可以在
Triangle
Rectangle
中覆盖它。 那是:
ShapeParser s;
while (s.hasNext())
     // Calls the proper implementation of parseShape()
     s.next().parseShape();
    ,嗯,在基类中添加一个parse方法,然后循环并遍历形状列表并调用s.parse()?     ,我认为该错误是因为s.next()返回Shape。逻辑上的事情是 添加parse()方法以成形并调用s.parse()     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。