簡體   English   中英

避免子類的類型轉換

[英]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專業化( ClientUserServiceServerUserService ),正如您已經從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM