3

我对 OOP 很陌生,并试图弄清楚。我有一个哺乳动物类的以下代码,我计划进一步开发。我有一个与正确值相呼应的 Bear 子类,但我无法覆盖 Grizzly 子类中的 $name、$move、$ear 或 $sound 值。

abstract class Mammal
{
    protected $name;
    protected $limbs;
    protected $offspring = 'live';
    protected $move;
    protected $eat;
    protected $sound;

    protected function __construct($name, $limbs, $offspring, $move, $eat, $sound) {
        $this->name = $name;
        $this->limbs = $limbs;
        $this->offspring = $offspring;
        $this->move = $move;
        $this->eat = $eat;
        $this->sound = $sound;
    }

    public function getOutput() {
        echo "The {$this->name} has four {$this->limbs}. The offspring is birthed {$this->offspring} and move by {$this->move}. They eat {$this->eat} and talk by {$this->sound}.";
    }
}

class Bear extends Mammal
{
    public function __construct() {
        Mammal::__construct('bear', 'claws', $this->offspring, '', '', '');
    }
}

class Grizzly extends Bear
{
    public function __construct() {
        Bear::__construct('grizzly bear', 'claws', $this->offspring, 'lumbering', 'salmon', 'roaring');
    }
}

$grizzly = new Grizzly;
$grizzly->getOutput();

我想要得到的输出是:“灰熊有四个爪子。后代是通过伐木而活下来的。他们吃鲑鱼,用咆哮说话。” 我很感激任何帮助!

4

3 回答 3

1

原因是您的熊类似乎没有变量。


class Bear extends Mammal
{
    public function __construct() { //See, this constructor takes nothing
        Mammal::__construct('bear', 'claws', $this->offspring, '', '', '');
    }
}

这是我为使其工作所做的工作



class Bear extends Mammal
{
    public function __construct($bear = 'bear') {//right hear
        Mammal::__construct($bear, 'claws', $this->offspring, '', '', '');
    }
}

您在 codepad.org 中的代码与我的小改动

注意:这就是我让它工作的方式

于 2013-10-12T01:00:13.503 回答
0

问题出在设计上Bear。您希望您的继承链不会阻塞您需要的值。也就是说,您不必调用父构造函数……</p>

class Grizzly extends Bear
{
    public function __construct() {
        Mammal::__construct('grizzly bear', 'claws', $this->offspring, 'lumbering', 'salmon', 'roaring');
    }
}

像我在这里所做的那样跳过父构造函数实际上并不是好的 OOP,但它可以工作(并且 PHP 的哲学价值观是这样的实用主义)。但是,在这种情况下,您可能希望修改Bear子类以启用对这些属性的访问。

class Bear extends Mammal
{
    public function __construct($type, $move, $eat, $sound) {
        parent::__construct($type . ' bear', 'claws', $this->offspring, $move, $eat, $sound);
    }
}

class Polar extends Bear
{
    public function __construct() {
        parent::__construct('polar', 'cross-country skiing', 'salmon', 'mewling');
    }
}

$polar = new Polar();
$polar->getOutput();

北极熊有四个爪子。后代通过越野滑雪活生生地出生。他们吃鲑鱼,用喵喵叫来说话。

于 2013-10-12T01:03:06.123 回答
0

我的想法:

如果你正在创造动物种类,那么熊应该抽象。你不应该创造熊,就像你不能创造哺乳动物一样。

熊和灰熊也有属性。

abstract class Bear extends Mammal
{
    protected $limbs = 'claws';
    protected $move = 'lumbering';
    protected $sound = 'roaring';
}

所有的熊都有爪子、木材和咆哮

class Grizzly extends Bear
{
    protected $name = 'Grizzly Bear';
    protected $eat = 'salmon';
}

灰熊吃鲑鱼

abstract class Mammal
{
    protected $name;
    protected $limbs;
    protected $offspring = 'live';
    protected $move;
    protected $eat;
    protected $sound;

    public function getOutput() {
        echo "The {$this->name} has four {$this->limbs}. The offspring is birthed {$this->offspring} and move by {$this->move}. They eat {$this->eat} and talk by {$this->sound}.";
    }
}

这将是我的解决方案。我一起摆脱了一个构造函数。

于 2013-10-12T01:22:08.390 回答