2 回答

TA貢獻1856條經(jīng)驗 獲得超5個贊
考慮使用適配器或裝飾器模式,并使用組合而不是繼承。例如:
public class B {
private final A a;
private final MyCustomClass myCustomClass;
B(A a) {
this.a = a;
myCustomerClass = new MyCustomClass(a.getMyClass());
}
public void doSomething() {
a.doSomething(); // updates the state of a.myClass.
myCustomerClass.doSomething(); // use the change of a.myClass to do more stuff
}
}
public class MyCustomClass {
private final MyClass myClass;
private String verySpecialString;
public MyCustomClass(MyClass myClass) {
this.myClass = myClass;
}
public void doSomething() {
verySpecialString = "Hey!" + myClass.getSomeResult();
}
}

TA貢獻1906條經(jīng)驗 獲得超3個贊
一般而言,在應用程序、庫等 for... 中,某些組件被設計為可擴展(因為雖然是 for),而某些其他組件實際上并未被設計為可擴展。
但是修改一個現(xiàn)有的組件通常不是擴展應用程序行為的方式。
因為現(xiàn)有的組件通常不是為了修改而設計的。他們的實際邏輯/處理可能會從一個版本到另一個版本發(fā)生很大變化。這些可能會從源代碼或其他任何東西中刪除......因此您將很難將原始源的更新合并到應用程序修改后的實現(xiàn)的源代碼中。
長話短說:應用程序可能允許擴展,但在這種情況下,它也提供了擴展點,您不能以任何方式更改任何類。
如果您想擴展原始源代碼的某些部分,您必須知道實際應用程序是否旨在擴展,如果是,如何擴展。
如果它不是為擴展而設計的,您應該接受應用程序更新可能不會集成(或難以集成)到修改后的應用程序中。
添加回答
舉報