0
  1. 基本クラス Hello の getCopy() と同じように見える場合、派生クラス HelloAndGoodbye の getCopy() メソッドを取り除く方法はありますか?

  2. さらに、これを達成するための効率的な方法は何ですか?

(2 つの関数の唯一の違いは、基本クラスでは 'static' が 'Hello' を参照し、派生クラスでは 'static' が 'HelloAndGoodbye を参照することです。そこに含まれる変数については、簡単に名前を変更できるため、両方の関数で同じです)。

<?php

class Hello {

  private $hello;

  public function createStub() {

    return new static(null);

  }

  public function __construct($hello) {

    $this->setHello($hello);

  }

  public function getCopy() {

    $helloCopy = static::createStub();

    $this->doCopy($helloCopy);

    return $helloCopy;

  }

  public function doCopy($helloCopy) {

    $helloCopy->setHello($this->hello);

  }

  public function setHello($hello) {

    $this->hello = $hello;

  }

  public function getHello($hello) {

    return $this->hello;

  }

  public function __toString() {

    return $this->hello . "\n";

  }

}

class HelloAndGoodbye extends Hello {

  private $goodbye;

  public function createStub() {

    return new static(null, null);

  }

  public function __construct($hello, $goodbye) {

    parent::__construct($hello);

    $this->setGoodbye($goodbye);

  }

  public function getCopy() {

    $helloAndGoodbyeCopy = static::createStub();

    $this->doCopy($helloAndGoodbyeCopy);

    return $helloAndGoodbyeCopy;

  }

  public function doCopy($helloAndGoodbyeCopy) {

    parent::doCopy($helloAndGoodbyeCopy);

    $helloAndGoodbyeCopy->setGoodbye($this->goodbye);

  }

  public function setGoodbye($goodbye) {

    $this->goodbye = $goodbye;

  }

  public function getGoodbye($goodbye) {

    return $this->goodbye;

  }

  public function __toString() {

    return parent::__toString() . $this->goodbye . "\n";

  }

}

function test() {

  $hello = new Hello("Hello John");

  $helloAndGoodbye = new HelloAndGoodbye("Hello Jane", "Goodbye Jane");

  echo $hello;

  echo $helloAndGoodbye;

}

test();

出力:

Hello John
Hello Jane
Goodbye Jane
4

1 に答える 1