Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何应用依赖于实现的方法调用?_Java_Oop - Fatal编程技术网

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

Java 如何应用依赖于实现的方法调用?,java,oop,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 }

我有一个
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()
方法,因为对象不应该知道如何删除自己

还有什么?

方法重载:

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

您仍然可以通过编写

class MyService<T> {
   void delete(T obj) {
     // Only the delete logic, but nothing specific for any type
   }
}
classmyservice{
作废删除(T obj){
//只有删除逻辑,但没有特定于任何类型的逻辑
}
}
然后,对于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);
    }
}
类MyFooService扩展了MyService{
作废删除(Foo obj){
//执行一些foo删除逻辑
//最后,调用超类,因为它知道如何执行真正的删除操作
super.删除(obj);
}
}

这样,您的
Foo
特定逻辑位于
MyFooService
中,并且您的
Foo
逻辑被放入一个单独的类中。作为额外的好处,这给了您可以进行良好单元测试的类。

我认为最好创建一个表示DeleteType的枚举

public enum DeleteType {

Foo, Bar  //..... }
MyService
中,delete方法可以接受两个参数,如

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

如果希望
delete
方法签名完好无损,那么
类型可以存储在
obj
本身中(通过使
obj
的类遵守一个契约(
接口
),这将使它
返回其
类型

我会把它变成一个抽象方法,让子类处理删除逻辑(类似于插入、更新、检索、检索所有…),这非常好!我认为它最适合我的需要。