2017-01-17 2 views
2

Снова и снова это случилось со мной: у нас есть класс CLS с init способом, как это:Не переписывать метод только для добавления одной строки кода?

init { 
    // do A 

    // do B 

    // do C 
} 

Теперь, в определенном случае, нам нужно сделать X точно между B и C. Создание подкласса CLS и переписывание всего метода init с вставленным там X не представляется мне хорошим решением (это противоположность DRY). Есть ли лучшее решение, которое мне не пришло в голову?

Пожалуйста, обратите внимание, что A, B и C небольшие фрагменты кода делает маленькие хитрости, как настройки пользовательского интерфейса, так что, вероятно, не очень хорошая идея, чтобы поместить их в отдельных методах. Я в настоящее время кодирую в JavaScript, но я думаю, что этот вопрос относится и к другим PL.

ответ

3

Обычно мы добавляем крючки в родительский класс, где мы ожидаем расширения. Я не помню, как это называется. Может быть, это template method pattern?

class Foo { 
 
    init() { 
 
    console.log("A"); 
 
    console.log("B"); 
 
    this.doX(); 
 
    console.log("C"); 
 
    } 
 
    doX(){} 
 
} 
 

 
class Bar extends Foo { 
 
    doX() { 
 
    console.log("X"); 
 
    } 
 
} 
 

 
new Bar().init();

+0

Ницца. Но я не вижу способа доступа к локальным переменным 'init' внутри' doX'. Есть идеи по этому поводу? (передача в качестве параметров и 'return' ограничена, и вам необходимо обновить суперкласс для подкласса« каждая новая потребность ») – user3702014

+0

@ user3702014 Вы можете передать соответствующие переменные doX, но вы не можете их модифицировать таким образом. Если у вас есть такая сложная функция, я бы рассмотрел возможность извлечь всю функциональность в новый класс (с полями, являющимися текущими локальными переменными). Если вы дадите нам больше возможностей, мы можем предложить решения, которые лучше всего соответствуют вашим потребностям –

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