【发布时间】:2011-06-10 01:07:36
【问题描述】:
我在使用 instanceof 运算符时遇到问题。我试图避免它。基本上,我有以下结构:
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) { }
【问题讨论】:
-
请发布错误...
-
为什么你的矩形叫
t? :-) -
更新问题;请看。
-
不,不,一百次不!不要让我过来打你 :-) 在 OO 中,object/class 是上帝。如果您发现自己处于 code 再次成为主要事物的情况,那么您将回到 OO 之前的日子。甚至观察者模式也应该遵循以下规则:...自动通知他们任何状态变化,通常通过调用他们的方法之一。
-
看起来越来越像你想要的访问者模式。例如,参见this thread。将其放入您的 Shape 层次结构中,您就无需使用解析代码或您想要类似应用的任何其他操作的代码来污染该层次结构。
标签: java polymorphism