Задать вопрос
vitaly_74
@vitaly_74

Принцип закрытости/открытости, как добавить новый метод?

Добрый день, выбрал тег PHP т.к. пишу на php и было бы удачей получить ответ на свой вопрос.
Собственно принцип гласит: Класс должен быть не изменяем, но открыт для расширения.
Как корректно добавить новый метод в расширяемый класс? использовать наследование или еще можно что то предложить?
  • Вопрос задан
  • 171 просмотр
Подписаться 2 Простой Комментировать
Решения вопроса 1
@doctrine
Вот два примера. Но все зависит от конкретного случая

public interface EngineStartOperation {
    void start();
}

public interface EngineStopOperation {
    void stop();
}

public interface NewWhatEverMethod {
    void whatEver();
}





public class Engine implements EngineStartOperation, EngineStopOperation {
    @Override
    public void start() {
        // existing method
    }

    @Override
    public void stop() {
        // existing method
    }
}



public class WhatEverEngine1 implements NewWhatEverMethod, EngineStartOperation, EngineStopOperation {
    @Override
    public void start() {

    }

    @Override
    public void stop() {

    }

    @Override
    public void whatEver() {
        // new  logic here
    }
}


public class WhatEverEngine2 implements NewWhatEverMethod, EngineStartOperation, EngineStopOperation {
    private final Engine engine;

    public WhatEverEngine2(final Engine engine) {
        this.engine = engine;
    }

    @Override
    public void start() {
        engine.start();
    }

    @Override
    public void stop() {
        engine.stop();
    }

    @Override
    public void whatEver() {
        // new  logic here
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@fix0_o
Ковыряй интерфейсы в PHP

interface EngineInterface
    {
        public function ArrayMerge($item_1);

        public function value_search($item_1, $item_2);
    }


class ArrayFunct
    {
        private $Engine;
      
        function __construct(EngineInterface $Engine)
        {
            $this -> Engine = $Engine;
        }

        public function ArrMerge($array)
        {
            return $this -> Engine -> ArrayMerge($array);
        }

        public function value_search($array, $search)
        {
            return $this -> Engine -> key_search($array, $search);
        }
    }


class Engine implements EngineInterface
    {

        private $array_result;
        private $array_count;

        public function ArrMerge($array) {

            // ваш функционал

            return $result;
        }

        public function value_search($array, $search) {

            // ваш функционал
                
            return $result;
        }
    }


$engine = new Engine;
    $ArrayFunct = new ArrayFunct($engine);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы