1

ほぼ同じメソッドとプロパティを共有し、どちらも親クラスを拡張する 2 つのクラスを想像してみてください。ただし、違いは最小限です。

class fields { 
 public function __construct() {
  global $id;
  $this->id = $id++;
 }
}

class input extends fields {
 public function __construct() {
  parent::__construct();
 }
 public function draw() {
  echo '<input>';
 }
}

class textarea extends fields {
 public function __construct() {
  parent::__construct();
 }
 public function draw() {
  echo '<textarea>';
 }
}

この疑似コードの方法で textarea クラスを書き直す方が効率的だと思います。

class textarea extends fields {
 public function __construct() {
  $this = new input(); // <<------ 
 }
 public function draw() {
  echo '<textarea>';
 }
}

基本的に、クラスが最初の例のクラスのように動作するようにするにはどうすればよいかわかりません。

本質的に、私は OOP を使用して次のことを行いたいと考えていますが、上記の最初の例のようにオブジェクトを使用できるようにしたいと考えています (オーバーロードされた可能性のあるメソッドを呼び出したり、異なるプロパティを持ったりすることができます):

function a() {echo '123';}
function b() {a();}

クラス全体をコピーして数行を変更しただけですが、もったいない気がします。

最終的な回答 それらの人々のおかげで、ここに呼び出しの例を組み合わせた回答があります:

abstract class fields { 
 private static $masterid = 0;
 public function __construct() {
  $this->id = self::$masterid++;
 }
}

class input extends fields {
 public $data;
 public function __construct($new = '') {
  parent::__construct();
  if ($new) $this->data = $new;
  else $this->data = 'Hello';
 }
 public function draw() {
  echo '<input>'.$this->export().'</input>';
 }
 public function export() {
  return 'ID '.$this->id.' = '.$this->data;
 }
}

class textarea extends input {
 public function __construct($new = '') {
  parent::__construct($new);
 }
 public function draw() {
  echo '<textarea>'.$this->export().'</textarea>';
 }
}

$a = new textarea();
$a->draw();
$a = new textarea('World');
$a->draw();
$a = new input('!');
$a->draw();

//Outputs:
// <textarea>ID 0 = Hello</textarea>
// <textarea>ID 1 = World</textarea>
// <input>ID 2 = !</input>
4

3 に答える 3

2

フィールドクラスを抽象クラスにし、ダレンが提案したように、「描画」メソッドをフィールドクラスの関数にします。

入力クラスでフィールドを拡張し、描画メソッドをオーバーライドする必要があります。これにより、そのメソッドの機能をカスタマイズでき、その中から親バリエーションを呼び出すことができます。

最後に、textarea クラスは入力クラスと多くの類似点を持つため、textarea 拡張入力を作成します。これにより、フィールドと入力の両方のプロパティとメソッドを継承します。

于 2012-09-26T23:38:06.970 に答える
0

「fields」クラスにdrawメソッドを持たせます。

public function draw($msg) {
    echo $msg;
}

次に、textareaまたはinputクラスに次のように入力します。

parent::draw("<input>");

これにより、使用するメソッドの数が減り、両方のタイプのフィールドに対して1つのメソッドを呼び出すことができます。

また、「fields」クラスで、IDコードを次のように変更します。

public $id
public function __construct($id) {
    $this->id = $id;
}

次に、サブクラスで:

parent::__construct(1); //Or whatever ID you want

IDは、設定するたびに同じ値になります。その結果、フィールドのすべてのサブクラスが同じIDになります。このようにして、各サブクラスは個別のIDを持ちます。

また、私はいいので、ここにすべてをまとめました:

public class field {
    $id;
    public __construct($id) {
        $this->id = $id;
    }

    public function draw($msg) {
        echo $msg;
    }
}

public class input extends field {
    public __construct() {
        parent::__construct(1);
        parent::draw("<input>");
    }
}

public class textarea extends field {
    public __construct() {
        parent::__construct(2);
        parent::draw("<textarea>");
    }
}

それがあなたが言ったことから私がそれをまとめる方法です。私はあなたが求めていたものを間違えたかもしれません。私は主にJavaプログラマーだと言えますか?

于 2012-09-26T23:30:48.953 に答える
0

あなたが何をしたいのかは正確には明らかではありません。あなたが与えた例では、構造は問題ないと思いますが、特にコンストラクターでいくつかの変更を加える必要があります。コンストラクターは、抽象メソッド draw() を使用して抽象化する必要があると思います。

abstract class fields { 

   // Use a static member to keep track of id's instead of making it global
   private static $id = 0;

   // Use an instance variable to keep track of a particular instance's id
   private $myId;

   public function __construct() {
      // Increment the static ID & assign it to the instance id.
      $this->myId = self::$id++;
   }

   // Provide a public getter, so that the ID can't be changed
   // externally to this class
   public function getId() {
       return $this->myId;
   }

   public abstract draw(); // Make sure all sub classes implement a draw() method.

}

class input extends fields {
   // Don't need to call the parent constructor if you're not adding anything
   // else. It will be called automatically.

   public function draw() {
      echo '<input>';
   }
}

class textarea extends fields {
   public function draw() {
      echo '<textarea>';
   }
}
于 2012-09-26T23:41:07.120 に答える