@l4m3r

Является ли бинарный узел наследником интерфейса небинарного узла?

Написал базовый интерфейс узла.
interface NodeInterface
{
    public function key();
    public function value();
    public function __construct($key, $value);
    public function contains(NodeInterface $node): bool;
    public function addChild(NodeInterface $node);
    public function setParent(NodeInterface $node);
    public function parent(): ?NodeInterface;
    public function children(): array;
    // ...
}


Реализовывая класс Node на основе него, мы получаем типичный узел с множеством детей. Ок.
Но вот, допустим, нужно написать класс бинарного узла для бинарного дерева.
Подузлов может быть только 2: left, right. Как реализовать?

  1. Наследоваться от Node и задавать жесткие ограничения:
    interface BinaryNodeInterface extends NodeInterface
    {
        public function left(): ?BinaryNodeInterface;
        public function right(): ?BinaryNodeInterface;
    }
    
    class BinaryNode extends Node implements BinaryNodeInterface
    {
        public function left(): ?BinaryNodeInterface
        {
            return $this->children[0] ?? null;
        }
    
        public function right(): ?BinaryNodeInterface
        {
            return $this->children[1] ?? null;
        }
    
        public function addChild(NodeInterface $node)
        {
            if (count($this->children) < 2) {
                parent::addChild($node);
            }
        }
    }

    Но тогда грубо нарушается принцип подстановки из SOLID.


  2. Сделать два разных базовых интерфейса типа MultiNodeInterface и BinaryNodeInterface, но тогда получится дублирование кода и не универсально.

  • Вопрос задан
  • 43 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

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