可能是一个愚蠢的新手问题:我想在这样的情况下避免使用instanceof运算符:
class Service {
method(Some param) { }
}
class Special extends Some { }
class SpecialService extends Service {
method(Some param) {
if (param instanceof Special) {
//do special things
}
}
method(Special param) {
//do special things
}
}
第二种特殊方法是否是避免实例的正确方法?
服务的来电方面是否会出现任何问题?在我的例子中,特殊服务是一个自定义版本,插入并从基本代码调用。将调用哪种方法?
Service s = new SpecialService();
s.method(specialparam);
请指出紧凑的描述或模式如何解决这个问题。似乎是基本的Java / OO知识......
答案 0 :(得分:0)
Java自动完成此操作。如果没有if语句,您的代码将完全按照您的意愿工作。在选择要执行的方法版本时,Java会选择最具体(大多数子类)的方法签名。
答案 1 :(得分:0)
我不确定 durron597 是对的。这完全取决于代码的编写方式。只有当两个变量都使用特定类型声明时,它才会自动工作:
//good
Special specialparam = new Special();
SpecialService s = new SpecialService();
s.method(specialparam);
代码
//bad
Some specialparam = new Special();
SpecialService s = new SpecialService();
s.method(specialparam);
或喜欢
//bad
Special specialparam = new Special();
Service s = new SpecialService();
s.method(specialparam);
无法按预期工作,因为已知的编译时类型用于选择方法。
整个设计看起来很可疑。这可能是正确的方法,但可能值得重新考虑。
dasblinkenlight 的评论中提到的Double dispatch可能是其中之一。但要做一个基类(Some
或Service
)应该知道特殊情况。简而言之,就是你写下这样的东西:
class Some {
public void dispatch(Service service) {
service.method(this);
}
}
class Special extends Some {
public void dispatch(Service service) {
service.method(this);
}
}
class Service {
void dispatch(Some some) {
some.dispatch(this);
}
void method(Some some) {
// do common things here
}
void method(Special some) {
method((Some)some);
}
}
class SpecialService extends Service {
method(Special param) {
//do special things
}
}