如果合同的設計是每個服務可以處理任何類型的請求,那麼你的MyService的實現,只需要MyRequest(如果其他休息時間種類的請求被傳入),是錯誤的。
如果合同的設計是服務和請求子類相互映射,例如MyService可以(也應該)只有處理MyRequest,那麼您將需要更改服務的接口。否則,在問題中編寫的當前界面不會執行問題描述的操作。解決方法之一是參數化服務接口:
interface Service<R> {
void process(R request);
}
那麼你的具體的MyService將
public class MyService implements Service<MyRequest> {
public void process (MyRequest r) {/*blah*/}
}
你可以看到在JDK行動這樣的一個例子 - Comparator接口正是這樣做的,原因完全一樣。http://java.sun.com/javase/6/docs/api/java/util/Comparator.html
我不能明白爲什麼你會的,但如果你仍然想限制MyRequest的層次結構是一個要求,那麼你就可以Service<R extends Request>
編輯交換Service<R>
:這顯然犯規在1.4上運行,所以做同樣的事情[1],你將需要使用訪客模式。它的醜陋,但1.4是醜陋=)
interface Service {
void process(Request visitor);
}
interface RequestVisitor {
void visitMyRequest(MyService service);
void visitYourRequest(YourService service);
void visitTheOtherRequest(TheOtherService service);
}
interface Request extends RequestVisitor { /* and any extra methods required for request*/ }
public class MyService implements Service {
public process(Request r) {r.visitMyRequest(this);}
public void doSpecialMyProcessing(MyRequest request) { /* your code using MyRequest*/ }
}
public class YourService implements Service {
public process(Request r) {r.visitYourRequest(this);}
public void doSpecialYourProcessing(YourRequest request) { /* your code using YourRequest */ }
}
public class MyRequest implements Request {
void visitMyRequest(MyService service) {
service.doSpecialMyProcessing(this);
}
void visitYourRequest(YourService service) {
throw new UnsupportedOperation("Cannot call visitYourRequest in MyRequest!");
}
void visitTheOtherRequest(TheOtherService service) {
throw new UnsupportedOperation("Cannot call visitTheOtherRequest in MyRequest!");
}
}
public class YourRequest implements Request {
void visitMyRequest(MyService service) {
throw new UnsupportedOperation("Cannot call visitMyRequest in YourRequest !");
}
void visitYourRequest(YourService service) {
service. doSpecialYourProcessing(this);
}
void visitTheOtherRequest(TheOtherService service) {
throw new UnsupportedOperation("Cannot call visitTheOtherRequest in YourRequest !");
}
}
[1] 實際上它的不一樣,因爲現在你將需要編寫爲每個請求型的方法。在1.4中,你將不得不施放instanceof等,以達到1.5對泛型的作用。
實際上你的第二個代碼(使用`RequestVisitor`爲1.4)根據`YourService`生成`MyService`,反之亦然。因爲`MyService`使用`MyRequest`來實現`Request`,它擴展了`RequestVisitor`,直接取決於所有的服務。不酷。 – Jakub 2009-05-20 14:35:37