ООП - Как заставить родительскую функцию выполнять некоторые функции по умолчанию? - PullRequest
0 голосов
/ 24 апреля 2018

В PHP у меня есть абстрактный класс (родительский), который расширяется дочерним классом.Я хочу, чтобы дочерний класс реализовал функцию parent.И когда я вызываю реализованную функцию child, функциональность parent по умолчанию должна вызываться автоматически.Возможно ли это?

Например, я хочу создавать функцию журнала родителя каждый раз, когда вызывается функция отправки потомка.

abstract class CommunicationService {
    // child classes must implement this
    abstract function send();
    abstract function receive();

    public function log($action) {
        echo 'Creating nice Log on = ' . $action;
    }
}

class ServiceA extends CommunicationService {
    public function send() {
        // Is it possible that the parent's logging functionality be invoked automatically by default?
        echo 'Send Message using Service A';
    }
    public function receive() {
        echo 'Receive Message using Service A';
    }
}

$serviceA = new ServiceA();
$serviceA->send(); // It should send message as well as create logs.
$serviceA->receive(); // It should just receive message and not log it.

Кроме того, возможно ли выполнить некоторые действия по умолчанию вродитель и остальные функции в дочернем?

наилучшими пожеланиями.

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Я собираюсь ответить на вторую часть вашего вопроса: «Можно ли выполнить какое-либо действие по умолчанию в родительском и остальные функции в дочернем?»Ответ - да, и один из способов сделать это - использовать «шаблон проектирования», известный как шаблонный метод :

Шаблонный шаблон - это шаблон поведенческого проектирования, которыйопределяет программный каркас алгоритма в операции, откладывая некоторые шаги до подклассов.

Я специально сделал это с ~ 60 строкой (не считая комментариев) PHP MVCмикро-фреймворк, источник которого находится здесь: https://github.com/dexygen/jackrabbitmvc/blob/master/barebones.lib.php

Шаблонный метод выглядит следующим образом:

static function sendResponse(IBareBonesController $controller) {
  $controller->setMto($controller->applyInputToModel());
  $controller->mto->applyModelToView();
}

Методы $controller->setMto и mto->applyModelToView реализуются в других местахисходный код, но дочерний класс должен реализовывать $controller->applyInputToModel - см. комментарии над источником.Также смотрите рецензию, которую я сделал на вдохновение для каркаса

0 голосов
/ 24 апреля 2018

Не уверен, что это именно то, что вам нужно.Но вы можете попробовать использовать механизм цепочки: -

abstract class CommunicationService {
// child classes must implement this
abstract function send();
abstract function receive();

public function log($action) {
    echo 'Creating nice Log on = ' . $action;
    return $this;
}

}

class ServiceA extends CommunicationService {
public function send() {
    // Is it possible that the parent's logging functionality be invoked automatically by default?
    echo 'Send Message using Service A';
}
public function receive() {
    echo 'Receive Message using Service A';
}

}

$serviceA = new ServiceA();
$serviceA->log('send')->send(); // It should send message as well as create logs.
$serviceA->receive(); // It should just receive message and not log it.
0 голосов
/ 24 апреля 2018

Любой класс, который расширяет родительский элемент, нуждается в своих функциях для явного вызова родительской функции log(), например:

public function send() {
    // Is it possible that the parent's logging functionality be invoked automatically by default?
    parent::log( 'some text' ); // Tell the parent to log
    echo 'Send Message using Service A';
}
...