0

私は一般的にクラス全体の継承を行う新参者ですが、PHP についてはもう少し混乱しています。

私は次のことを望みます:

class Base
{
     //some fields and shared methods...
}

class Node
{
     private $children = array();

     public function getChildren()
     {
          ...
     }

     public function addChild($item)
     {
         $children[] = $item;
     }

     public function sum()
     {
     }
}

I want $item to be either another Node or a Leaf:

class Leaf extends Base
{
     private $value;

     public getValue()
     {
     }

     public setValue($someFloatNumber)
     {
          $this->value = $someFloatNumber;
     }
} 

public sum() の場合、次のようなものが必要です。

$sum = 0;

foreach ($children as $child)
{
    switch(gettype($child))
    {
        case "Node":
           $sum+= ((Node) $child)->sum();
           break;
        case "Leaf":
           $sum+= ((Leaf) $child)->getValue();
           break;
    }
}

return $sum;

キャストの仕方がわからない。また、配列は追加された $item のタイプを格納しますか?

4

2 に答える 2

1

これは適切な OOP ではありません。代わりにこれを試してください:

(実装したくない場合はabstract)にメソッドsumを追加します。これと同じメソッドをにBase実装すると、単純に が返されます。次に、両方のタイプを単純に呼び出すことができるため、大文字と小文字を区別したり、タイプを認識したりする必要はありません。sumLeafgetValuesum

foreach ($children as $child) {
    $sum += $child->sum();
}

これはポリモーフィズムと呼ばれ、オブジェクト指向プログラミングの基本概念の 1 つです。

あなたの質問にも答えるために、Netbeans と Zend Studio (およびおそらく他のエディター) でローカルにタイプをヒントすることができます:

/* @var $varName Type_Name */
于 2013-01-24T01:23:59.080 に答える
1

ヒントについて質問していますが、コードでは実際にキャストを実行しようとしています。これは必要ではなく、そのようには不可能です。

ヒントの例:

private function __construct(Base $node) {}

Baseこれにより、クラスのインスタンスまたは継承クラスのみを関数に渡すことができます。

または、IDE で作業することが重要な場合は、次のことができます。

$something = $child->someMethod(); /* @var $child Base */

これにより、IDE(および他のソフトウェア)がそれ$childがタイプであることを確認できますBase

is_aキャストする代わりに、次のように使用できます。

if (is_a($child, 'Node') {}
else (is_a($child, 'Leaf') {}

しかし、正直なところ、コードをリファクタリングする必要があるように思えます。葉がノードと異なるというのは良い考えではないと思います。リーフは、子を持たない単なるノードであり$node->hasChildren()、必要に応じてリーフ フラグを使用していつでもテストでき、設定および設定解除することもできます。

于 2013-01-24T01:28:23.210 に答える