2013-05-29 9 views
8

Я работаю с Java API, используемым для «макросов», которые автоматизируют часть программного обеспечения. API имеет, помимо прочего, классы Simulation (глобальное состояние) и FunctionManager. Я ничего не могу сделать, чтобы изменить эти классы.Расширение класса, созданного другим классом

Я хотел бы сделать класс BetterFunctionManager, который extends FunctionManager, потому что последний не имеет некоторых полезных функций. Но я не знаю, как это сделать, потому что FunctionManager не может быть создан непосредственно. Он должен быть получен из Simulation, как это:

Simulation simulation = getCurrentSimulation(); 
FunctionManager functionManager = simulation.getFunctionManager(); 

Обратите внимание, что Simulation не может быть реализован либо непосредственно; он должен быть получен через getCurrentSimulation() (текущая симуляция определяется во время выполнения макроинтерпретатором).

Я не могу опустить; следующий бросает ClassCastException:

BetterFunctionManager betterFunctionManager = simulation.getFunctionManager(); 

Как я могу построить BetterFieldFunctionManager?

+2

Вы можете создать класс, содержащий атрибут «Симуляция», и проложить путь ко всем методам переопределения. Затем вы можете вернуть его 'BetterFunctionManager'. – Djon

+1

делает 'FunctionManager' выставляют всех участников как общедоступные, которые вам нужны в' BetterFieldFunctionManager'? Или вам нужен доступ к защищенным членам? –

+0

@ Андреас: Да, насколько мне известно, все, что мне нужно, является публичным. –

ответ

4

Отказ от ответственности: Я по-прежнему очень наивна относительно проектирования. Просто предложение. использовать delegation design pattern

public class BetterFunctionManager{ 
    private FunctionManager fm; 
    public BetterFunctionManager(FunctionManager fm){ 
     this.fm = fm; 
    } 

    existingMethods(){ 
     fm.existingMethods(); 
    } 

    newMethods(){ 
     // new implementation 
    } 
} 

Недостатки:

необходимость обернуть все методы FunctionManager

Преимущество:

нет необходимости менять в любом другом месте. просто изменить как

BetterFunctionManager betterFunctionManager = 
       new BetterFunctionManager (simulation.getFunctionManager()); 
+2

Достаточно хорошая идея, этот механизм называется делегированием. ;) Он применяет принцип предпочтения композиции над наследованием. – Nicocube

+0

@Nicocube .. спасибо. да, это шаблон делегирования ... :) .... http://en.wikipedia.org/wiki/Delegation_pattern – stinepike

+0

Это то, что я уже реализовал. Я надеялся расширить, а не делегировать, потому что не хочу писать методы-оболочки для всех 'existingMethods'. Но спасибо за подтверждение того, что это правильный путь вперед. –

1

Поскольку ваши возможности ограничены из-за структур классов, как насчет создания класса FunctionManagerUtility вместо BetterFunctionManager. В классе FunctionManagerUtility вы можете добавлять методы для добавления полезных функций, используя объект FunctionManager в качестве ввода.

2

То, что вы нашли известен как The Expression Problem, и я боюсь, что ваш самый разумный вариант, чтобы атаковать его с чистой Java является предложение StinePike о использовании состава и делегирования

Если вы находитесь в позиции чтобы выбрать инструмент для задачи, я бы рекомендовал вам взглянуть на Clojure Protocols. Они предлагают действительно хорошее решение проблемы выражения (см. Очень хорошее объяснение здесь Solving the Expression Problem with Clojure), и если я не ошибаюсь, если вы закончите кодирование своего решения в clojure, вы можете скомпилировать его в java-класс и использовать его в своем приложении Java

+0

Спасибо, что поместили имя в мою проблему. Отличная статья, на которую вы ссылаетесь. В некотором смысле приятно знать, что это проблема для всех, а не только я не в состоянии понять это! –

Смежные вопросы