我想創建一個公共服務和公共請求,如下所示:
public interface CommonService {
CommandDTO createOrUpdate(CommonRequest request);
}
然后實作這個服務,如下圖所示:
public class CompanyARequest extends CommonRequest {
// properties
}
public class CompanyAServiceImpl implements CommonService {
@Override
public CommandDTO createOrUpdate(CompanyARequest request) {
// ...
}
}
但是,盡管CompanyARequest繼承自CommonRequest,createOrUpdate方法會拋出“方法不會覆寫其超類中的方法”錯誤。
另一方面,如果我對請求使用泛型,錯誤就消失了,但是如果我對請求和 dto 使用泛型,則會使用太多的字母,我只想對將要使用的物體使用通用字母在CommonService. 那么,我該如何解決這個問題?我的實作有什么錯誤嗎?
uj5u.com熱心網友回復:
該CompanyAServiceImpl::createOrUpdate實作僅考慮由 定義的整個空間的一小部分CommonService::createOrUpdate。這就是為什么說“方法不會覆寫其超類中的方法”(至少不完全是)。
要查看它,請考慮接收作為引數 any 的某個方法,CommonService例如:
void runService(CommonService commonService) { ... }
如何runService知道(在編譯時)什么是正確的引數commonService.createOrUpdate?它只知道它必須是CommonRequest(或者,傳遞地,任何擴展它的類)。但是您的CompanyAServiceImpl::createOrUpdate實作僅支持其中之一。
換句話說,createOrUpdate 必須支持任何引數是CommonRequest.
您能做的最好的事情取決于您正在尋找的抽象型別(并且您的問題沒有描述要解決的問題)。
但是,您可能正在尋找類似于以下內容的內容:
interface CommonRequest {
String requestDescription();
}
interface CommonService<Request extends CommonRequest> {
String serviceName();
boolean createOrUpdate(Request request);
}
static class CompanyARequest implements CommonRequest {
public String requestDescription() { return "A Req"; }
}
static class CompanyAService implements CommonService<CompanyARequest> {
public String serviceName() { return "A Co"; }
public boolean createOrUpdate(CompanyARequest companyARequest) { return true; }
}
static class CompanyBRequest implements CommonRequest {
public String requestDescription() { return "B Req"; }
}
static class CompanyBService implements CommonService<CompanyBRequest> {
public String serviceName() { return "B Co"; }
public boolean createOrUpdate(CompanyBRequest companyBRequest) { return false; }
}
現在,所有呼叫的行程createOrUpdate都將被迫知道哪個引數是正確的,但是所有公司的通用行程仍然可以共享一個實作,例如使用日志運行:
static <R extends CommonRequest> void runService(CommonService<R> service, R request) {
System.out.printf("Running service '%s':%n", service.serviceName());
if(service.createOrUpdate(request))
System.out.printf(" - Success with parameter '%s'.%n", request.requestDescription());
else
System.out.printf(" ! Error with parameter '%s'.%n", request.requestDescription());
}
如果我們跑
runService(new CompanyAService(), new CompanyARequest());
runService(new CompanyBService(), new CompanyBRequest());
我們得到
Running service 'A Co':
- Success with parameter 'A Req'.
Running service 'B Co':
! Error with parameter 'B Req'.
當然,所有這一切都是如果該引數 ( CommonRequest) 和該方法 ( createOrUpdate) 將在您的應用程式中的許多地方通用,否則,只需向您的公司添加一個新方法:
public class CompanyAServiceImpl implements CommonService {
@Override
public CommandDTO createOrUpdate(CompanyRequest request) {
// ...
}
public CommandDTO createOrUpdateWithA(CompanyARequest request) {
// ...
}
}
uj5u.com熱心網友回復:
您正在根據我的理解尋找通用介面:
public interface CommonService<C extends CommonRequest> {
CommandDTO createOrUpdate(C request);
}
public class CompanyAServiceImpl implements CommonService<CompanyARequest> {
@Override
public CommandDTO createOrUpdate(CompanyARequest request) {
// ...
}
}
如果你像第一次那樣定義它,問題是CommonRequest方法應該根據它在介面中的定義來接受任何。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/394021.html
上一篇:移動開發—課后習題答案
下一篇:從基類C 呼叫重寫的方法
