如何解决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 举报,一经查实,本站将立刻删除。