![](/img/trans.png)
[英]Java- When class A call the classB, in class B how can I use the method and attribute of classA?
[英]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.