如何在Java中使用具有共享方法的超类和子类

idfiyjo8  于 2023-02-20  发布在  Java
关注(0)|答案(1)|浏览(98)

我有一个超类Currency,我想有一堆不同的子类继承这个超类,例如USDGBPYEN等。
每个子类都有相同的属性和方法。方法将返回相同类型的值,但方法的主体需要略有不同。下面是一个示例(我使用API调用来获取我所拥有的每种货币的金额):

public class USD extends Currency {
        
        public String symbol;
        public String holdings;
        public String bankAccountId; // Each currency has it's own account

        public float getHoldings(String apiKey) {
            HttpClient httpClient = HttpClient.newHttpClient();

            URI uri = new URIBuilder(apiBaseurl)
                .addParameter("module", "account")
                .addParameter("action", "tokenbalance")
                .addParameter("accountid", this.bankAccountId)
                .addParameter("apikey", apiKey)
                .build();
    
            HttpRequest getHoldingsRequest = HttpRequest.newBuilder()
                .uri(uri)
                .GET()
                .build();
    
            HttpResponse<String> response = httpClient.send(getHoldingsRequest, BodyHandlers.ofString());
    
            ObjectNode node = new ObjectMapper().readValue(response.body(), ObjectNode.class);
    
            return node.get("result").asFloat();
        }
    }

我的主要问题是我不想在每个子类中重复这个getHoldings()方法,所以我决定尝试将它放到Currency超类中,但是我有两个新问题:
1.我不能在该方法中使用this.bankAccountId(每种货币都保存在一个单独的帐户中,特定于该货币,我希望将String bankAccountId作为特定货币子类的属性)。
1.我不能循环遍历每种货币并对每种货币使用getHoldings()方法,如下所示:

Portfolio portfolio = new Portfolio();
    String myApiKey = "duivbncvavsuivavcshinseo" // Some apiKey here
    
    portfolio.setOwnedCurrencies(Arrays.asList(
        new USD(),
        new GBP(),
        new YEN()    
    ));

    for (Currency currency : portfolio.getOwnedCurrencies()) {
        System.out.println(currency.getHoldings(myApiKey));
    }

我已经考虑过使用泛型,这样我就可以有Currency<USD>,但是我不知道如何在这种情况下正确地使用它们。我也觉得我错过了一些非常基本/简单的东西,但是我已经盯着这个问题太久了,我就是看不到它。
编辑:我应该提到,每个Currency子类都有其他唯一值,所以每个子类都有相同的属性,但属性会有不同,不仅仅是bankAccountId

cgvd09ve

cgvd09ve1#

如果需要的话,为什么不通过将id作为Ann参数发送到方法中来使用它呢?“超类扩展自”对方法的处理在最差的保护方法中可以是包私有的(不应该是公共的)(除非你希望其他类能够直接访问),如果你需要从过程中带回多个结果,例如bankid和holdings答案,你可以返回一个数组或Vector。

相关问题