亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

避免類上的代碼重復

避免類上的代碼重復

呼啦一陣風 2021-07-13 17:01:21
我正在編寫一些類,它們都實現了從接口繼承的某個方法。除了對某個其他函數的一次調用之外,此方法對于所有類都幾乎相同。例如:public void doSomething(){    int a = 6;    int b = 7;    int c = anOtherMethod(a,b);    while(c < 50){        c++;    }}如果多個類都有函數 doSomething() 但方法 anOtherMethod() 的實現不同怎么辦?在這種情況下如何避免代碼重復?(這不是我的實際代碼,而是一個簡化版本,可以幫助我更好地描述我的意思。)
查看完整描述

3 回答

?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

假設每個版本都anOtherFunction接受兩個整數并返回一個整數,我只會讓該方法接受一個函數作為參數,使其成為高階。


接受兩個相同類型參數并返回相同類型對象的函數稱為 a BinaryOperator。您可以向方法中添加該類型的參數以傳遞函數:


// Give the method an operator argument 

public void doSomething(BinaryOperator<Integer> otherMethod) {

    int a = 6;

    int b = 7;


    // Then use it here basically like before

    // "apply" is needed to call the passed function

    int c = otherMethod.apply(a,b);

    while(c < 50) 

        c++;

    }

}

您如何使用它取決于您的用例。作為使用 lambda 的一個簡單示例,您現在可以這樣稱呼它:


doSomething((a, b) -> a + b);

它只是返回的總和a及b。


但是,對于您的特定情況,您可能會發現將其doSomething作為接口的一部分并不是必需的或最佳的。如果相反,anOtherMethod需要提供什么?不要期望您的類提供 a doSomething,而是讓它們提供 a BinaryOperator<Integer>。然后,當您需要從 獲取結果時doSomething,從類中獲取運算符,然后將其傳遞給doSomething。就像是:


public callDoSomething(HasOperator obj) {

    // There may be a better way than having a "HasOperator" interface

    // This is just an example though

    BinaryOperator<Integer> f = obj.getOperator();


    doSomething(f);

}



查看完整回答
反對 回復 2021-07-14
?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

這看起來是模板方法模式的一個很好的例子。

  1. 放入doSomething一個基類。

  2. abstract protected anotherMethod也在該基類中聲明,但不提供實現。

  3. 然后每個子類為 提供正確的實現anotherMethod。


查看完整回答
反對 回復 2021-07-14
?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

這就是您如何實現 Thilo 在以下演示中談到的技術:


主要類:


public class Main extends Method {


    public static void main(String[] args) {

        Method m = new Main();

        m.doSomething();

    }


    @Override

    public int anOtherMethod(int a, int b) {

        return a + b;

    }

}

抽象類:


public abstract class Method {


    public abstract int anOtherMethod(int a, int b);


    public void doSomething() {

        int a = 6;

        int b = 7;

        int c = anOtherMethod(a, b);


        System.out.println("Output: "+c);

    }

}

這樣,您所要做的就是anOtherMethod()在要使用doSomething()方法的不同實現的每個類中進行覆蓋anOtherMethod()。



查看完整回答
反對 回復 2021-07-14
  • 3 回答
  • 0 關注
  • 197 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號