[英]Avoid type casting for subclasses
我有兩個繼承自同一個 class 的類:
ClientUserManager extends UserManager
和
ServerUserManager extends UserManager
UserManager 是抽象的。
public abstract class UserManager {
protected final UserService userService;
public UserManager(UserService userService) {
this.userService = userService;
}
例如,服務器子類:
public class ServerUserManager extends UserManager {
public ServerUserManager(UserService userService) {
super(userService);
}
public void someMethod() {
((ServerUserSerivice)userService).doSomethingForSERVERONLY();
}
但是,我的每個子類都應該能夠使用它們的UserService
專業化( ClientUserService
或ServerUserService
),正如您已經從someMethod()
中看到的那樣。 我希望能夠在沒有常量類型轉換的情況下做到這一點。
有更優雅或更通用的解決方案嗎?
附帶信息:為了證明為什么我想同時概括事物並保持專業化(正如 Oğuzhan Aslan 已經指出的那樣),讓我說我使用了一個依賴注入框架(Dagger 2),它為我提供了相同的“關鍵"/superclass,相應的實現作為回報(這里是客戶端或服務器)。
我並不完全清楚您要達到的目標,但我一般會建議根據您的用例嘗試和使用設計模式。
這似乎類似於“策略模式”。 你有一個上下文(UserManager),它應該得到一些特定的策略(UserService)並使用它。
例如:
public interface UserService {
public void execute();
}
public class ServerUserService implements UserService {
public void execute(){
//does something for server
};
}
class ServerUserManager {
private UserService userService;
public ServerUserManager(UserService userService) {
this.userService = userService;
}
public void doSomething() {
return this.userService.execute();
}
};
你可以谷歌“策略模式”來查看不同的實現方式
一種選擇是使用 generics:
public abstract class UserManager<T extends UserService> {
protected final T userService;
public UserManager(T userService) {
this.userService = userService;
}
}
public class ServerUserManager extends UserManager<ServerUserService> {
public ServerUserManager(ServerUserService userService) {
super(userService);
}
public void someMethod() {
userService.doSomethingForSERVERONLY();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.