继承和实例

时间:2012-12-07 16:36:47

标签: java oop inheritance

  

可能重复:
  Java method overloading + double dispatch

可能是一个愚蠢的新手问题:我想在这样的情况下避免使用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知识......

2 个答案:

答案 0 :(得分:0)

Java自动完成此操作。如果没有if语句,您的代码将完全按照您的意愿工作。在选择要执行的方法版本时,Java会选择最具体(大多数子类)的方法签名。

Here is a really good article on the subject.

答案 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可能是其中之一。但要做一个基类(SomeService)应该知道特殊情况。简而言之,就是你写下这样的东西:

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 
  }
}