Я разрабатываю приложение на основе проекта с открытым исходным кодом. Мы заплатили разработчикам за то, чтобы они сделали собственное приложение с закрытым исходным кодом на основе их кода. Мы действительно хотим сохранить совместимость с исходным пакетом, обновления безопасности и функций будут объединены с нашим приложением.
Конечно, самая большая проблема здесь — слияние с новыми обновлениями, если я сильно модифицировал исходный код. Я искал в Интернете лучшее решение и, среди прочего, нашел такие веб-сайты, как этот. Поэтому я решил не изменять исходный код настолько, насколько мог. Если я хочу добавить функциональность к существующей функции, я расширяю исходный класс, делаю так, чтобы приложение указывало на мой расширенный класс (что является достаточно небольшой модификацией, чтобы не создавать проблем) и реализую свои изменения.
Проблема здесь в свойствах стороннего класса, которые я также хочу расширить. В приведенном ниже примере class A
вносятся некоторые изменения в свойство myClass
, которые я хочу, чтобы он продолжал делать. Но class B
, которое расширяет class A
, содержит свойство с типом, который расширяет само MyClass
, здесь MyCustomClass
. Внутри class B
я хочу, чтобы свойство myCustomClass
было расширением myClass
, любые изменения, внесенные в myClass
, должны быть доступны в myCustomClass
.
Насколько мне известно, приведение myClass
к myCustomClass
невозможно, так как myClass
просто не относится к типу myCustomClass
. Итак, какое лучшее решение здесь, которое сохраняет совместимость с class A
и не требует простого копирования всего кода из class A
, поскольку это создаст точно такие же проблемы, если class A
получит обновление?
Вот пример кода, который должен лучше объяснить мой вопрос:
// Classes 'A' and 'MyClass' are 3rd party, I do not want to edit them
public class A {
private MyClass myClass;
A(){
myClass = new MyClass();
// Changes I want to keep doing
doSomething();
}
public void doSomething(){
// Do some calculations to myClass and modify it accordingly
}
public MyClass getMyClass(){
return myClass
}
}
// Classes 'B' and 'MyCustomClass' are 1st party, I can do anything I want with them :)
public class B extends A{
private MyCustomClass myCustomClass;
B(){
super();
myCustomClass = ?????????;
// Extremely important message, this should keep working
System.out.println(myCustomClass.verySpecialString);
// Build further on made modifications, this should keep working too
useModificationsByClassA();
}
public void useModificationsByClassA(){
// Use result of class A's calculations in order to continue
}
}
public class MyCustomClass extends MyClass{
private String verySpecialString;
MyCustomClass(){
super();
verySpecialString = "Hey!";
}
}
class A
? - person Samuël Visser   schedule 10.09.2018