我在webDesign上学习了第3年的模块,重点关注OOP概念,这些概念我很难掌握,但却慢慢到达那里......
作业分类问题如下:
我对上面的问题进行了编码,得到了正确的输出但是:
greet()
方法的编码方式B是对的吗?
2.对于问题B constructor
内的properties
和相关的sub class
,我怀疑这些是否正确编码...即使我得到正确的输出,请参阅注释在代码中任何建议表示赞赏,代码如下。
A)
class Animal{
private $name;
public function __construct($dogName){
$this->name = $dogName;
}//construct
public function greet(){
$sting = "Hello I'm some sort of animal and my name is .$this->name.";
return $sting;
}//function
}//class
$animal = new Animal('Jock');
echo $animal->greet();
B - SubClass
class Dog extends Animal
{
private $animalType;
public function __construct($animalType, $dogName){
$this->$animalType = $animalType;
$this->dogName = $dogName; //IS THIS LINE CORRECT, IF YES WHY SHOULD I USE IT AGAIN IN PARENT::_CONSTRUCT?
//Call Animal Constructor To Finish
parent::__construct($dogName);
}//constructor
public function greet($value1, $value2){
$this->animalType = $value1;
$this->dogName = $value2;
$string = "Hello, I'm a ". $value1. " and my name is ". $value2;
return $string;
}
}
$dog = new Dog('Dog', 'Jock');
echo $dog->greet('Dog', 'Jock');
答案 0 :(得分:1)
我认为问题的措辞略有错误。我认为它希望你创建属性protected
而不是private
来扩展类(否则你必须在子类中重新定义相同的属性)。
如果是这种情况,这是一个显示类继承的示例:
class Animal
{
protected $name;
public function __construct($name)
{
$this->name = $name;
}
public function greet()
{
return "Hello I'm some sort of animal and my name is {$this->name}.";
}
}
$animal = new Animal('Jock');
echo $animal->greet();
class Dog extends Animal
{
public function greet()
{
return "Hello I'm a dog and my name is {$this->name}.";
}
}
$dog = new Dog('Jock');
echo $dog->greet();
您可以看到我们不需要重新定义属性$name
和构造函数。班级Dog
知道它是一只狗,所以我们不需要告诉它 - 我们只是相应地调整我们的问候方法。这显示了我们如何从protected
访问$name
属性Dog
,并展示了我们如何覆盖greet
中的Dog
方法。
我希望这能说明这个问题。
答案 1 :(得分:1)
我认为你不需要Dog类中的构造函数。问候功能看起来不对。我认为您必须使用名称getter(getName)来使用Animal类中的名称。
class Animal
{
private $name;
public function __construct($name)
{
$this->name = $name;
}//construct
public function greet()
{
$sting = "Hello I'm some sort of animal and my name is " . $this->getName();
return $sting;
}//function
public function getName() {
return $this->name;
}
}//class
$animal = new Animal('Jock');
echo $animal->greet();
class Dog extends Animal
{
public function greet()
{
$string = "Hello, I'm a dog and my name is " . $this->getName();
return $string;
}
}
$dog = new Dog('Jock');
echo $dog->greet();
答案 2 :(得分:1)
代码问题:
1)为什么你会有Dog::$animalType
字段?扩展泛型Animal
类的目的是使其与Dog
子类相当具体。相反,只需使用strtolower(__CLASS__)
作为动物类型。
2)Dog::greet()
方法不需要任何参数。它可以清楚地使用$this->dogName
。
3)您应将两个名称字段命名为Animal::$name
和Dog::$name
。这样,子类将从其父类继承并覆盖值。相反,你引入了另外的字段来做同样的事情,并打破了父类和子类之间的逻辑关系。
4)父类和子类对于具有相同名称的方法应该具有相同的签名,以便继承可以有目的。由于子类按原样继承父类,因此无需重新定义它们(在您的情况下,构造函数)。
class Animal
{
private $name; // can't be private (unless you use a getter), if you want to extend it
public function __construct($name)
{
$this->name = $name;
}
public function greet()
{
return "Hello I'm some sort of animal and my name is " . $this->getName();
}
protected function getName()
{
return $this->name;
}
}
class Dog extends Animal
{
public function greet()
{
return "Hello, I'm a " . strtolower(__CLASS__) . " and my name is " . $this->getName();
}
}
$animal = new Animal('Cow');
echo $animal->greet();
$dog = new Dog('Max');
echo $dog->greet();
答案 3 :(得分:0)
另一种方法
<?php
class Animal{
protected $name;
public function __construct($dogName){
$this->name = $dogName;
}//construct
public function greet(){
$sting = "Hello I'm some sort of animal and my name is .$this->name.";
return $sting;
}//function
}//class
$animal = new Animal('Jock');
echo $animal->greet();
class Dog extends Animal
{
private $animalType;
public function __construct($animalType,$dogname){
$this->animalType = $animalType;
parent::__construct($dogname);
}
public function greet(){
echo "Hello, I'm a ".$this->animalType. " and my name is ".$this->name;
}
}
$dog = new Dog('Dog', 'New Dog');
echo $dog->greet();
?>