如何应用依赖于实现的方法调用?

时间:2013-03-31 16:49:29

标签: java oop

我有一个delete(object)方法,应根据要删除的对象执行不同的代码。

class MyService {

   void delete(Object obj) {
     if (obj instanceof Foo) {
         //execute some foo deletion logic
     } 
     if (obj instanceof Bar) {
         //execute some bar deletion logic
     }
     //if... and so on
   }
}

从设计的角度来看,我如何避免instanceof检查? 我无法在所有实现中引入delete()方法,因为对象不应该知道它们应该如何删除自己。

还有什么?

3 个答案:

答案 0 :(得分:5)

您仍然可以通过编写

来使用子类化机制(甚至可以使其成为通用的)
class MyService<T> {
   void delete(T obj) {
     // Only the delete logic, but nothing specific for any type
   }
}

然后,对于Foo,你要创建一个子类:

class MyFooService extends MyService<Foo> {
    void delete(Foo obj) {
        //execute some foo deletion logic
        // finally, invoke super class as it knows how to do the real delete action
        super.delete(obj);
    }
}

这样,您的Foo特定逻辑位于MyFooService,您的Foo逻辑将被置于单独的类中。作为额外的奖励,这可以为您提供经过单元测试的课程。

答案 1 :(得分:2)

方法重载:

void delete(Foo f) {}
void delete(Bar b) {}

答案 2 :(得分:0)

IMO最好创建一个代表DeleteType的枚举说

public enum DeleteType {

Foo, Bar  //..... }

并且在MyService中,delete方法可以使用2个参数,例如

void delete(DeleteType type, Object object) {
switch(type) {
case Foo:
 //Deletion of Foo objects....
 break;
case Bar:
//Deletion of Bar objects....
 break;
 ....
}
}

如果您希望delete方法签名完好无损,那么type可以存储在obj内(通过使obj的类符合合同(interface)将使return成为type