簡體   English   中英

A類實例化B類實例。 ClassB的實例如何調用A類的方法?

[英]Class A instantiates a Class B instance. How can the Instance of ClassB call a method of class A?

我有2個類,並且已經使一個類(A類)實例化了B類對象。

我在B類中有一個方法要在A類中調用一個方法。

我正在從事一個更大的項目來練習Java,因此我在這里簡化了事情。

// A類:

public class ClassA {
  private int number;
  private ClassB instanceOfB = new ClassB();

  public ClassA {
    number = 0;
  }

  public void incrementNumber {
    number++;
  }

  public void incrementNumberLongWay {
    instanceOfB.incrementNumberInA()
  }
} 

// B類:

public class ClassB {
  public void incrementNumberInA() {
    // My desire: Call Class A's incrementNumber method
    // What should I put here?
   }

}

如何確定crementNumberLongWay有效? 類A已被實例化,並調用了methodIncrementNumberLongWay方法,因此應調用ClassB的方法IncrementNumberInA

我知道這似乎非常令人費解,但是我這樣做的原因是因為在我的程序中我沒有增加數字,而是在B類中進行了一些邏輯運算,並且只想在某些情況下影響A類。

您無法使用提供的代碼執行此操作。 關系默認是一種方式。 B不了解A,因此無法訪問它。

您可以做的是在構建過程中將A的引用傳遞給B,然后通過該引用訪問A。

ClassB對ClassA一無所知。 所以,你做不到。 丑陋的決定是

public void incrementNumberLongWay() {
        instanceOfB.incrementNumberInA(this);
    }

和在

public class ClassB {
    public void incrementNumberInA(ClassA cl) {
        cl.incrementNumber();
    }
}

您不能從類B調用類A的方法,因為類B沒有引用類a的對象。 但是,您可以將A類的當前數字狀態作為參數傳遞給B類,然后從B類返回一個值,然后A類可以獲取和使用它。

例如:

public class A {
    private int number;
    public A(int number) {
        this.number = number;
    }
    public void incrementNumber(boolean largeIncrement) {
        if(largeIncrement) {
            B bInstance = new this.B();
            number = bInstance.incrementNumberLongWay(number);
        }
        else {
            number++;
        }
    }
    private class B {
        private B() {
            // if some initialization is needed...
        }
        public int incrementNumberLongWay(int num) {
            num += 1000;
            return num;
        }
    }
}

希望這就是您想要的。

一種解決方案是傳遞A方法作為回調。

例如:

public class ClassA {
  private int number;
  private ClassB instanceOfB = new ClassB();

  public ClassA {
    number = 0;
  }

  public void incrementNumber {
    number++;
  }

  public void incrementNumberLongWay {
    instanceOfB.incrementNumberInA(this::increment);
    // alternatively
    // instanceOfB.incrementNumberInA(() -> incrementNumber());
  }
} 

public class ClassB {
  public void incrementNumberInA(Runnable callbackMethod) {
    callbackMethod.run();
  }
}

這消除了B對A的依賴,而是允許使用通用的回調機制。

但是,對於這種簡單的情況,不建議使用此方法。

以這種方式具有循環依賴關系通常可能是一個壞主意。 打破周期的一種方法是讓第三類(classC?)實現增量邏輯(或與您的實際等效的任何東西),並讓classA和classB實例各自引用classC。 這樣,就不會有兩個類彼此了解的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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