Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:完成的不错呢, 这几天的复习课, 上了吗?
# 一个类一旦被设置为抽象类,就具备了二个特点:
# 不能实例化
# 子类必须实现父类的抽象方法
# 注意:
# 属性设置为抽象无意义, 抽象仅针对方法,类
# 子类的成员可见性必须等于或高于所继承的抽象类成员可见性
# 子类重写的抽象方法可见性,用protected还是pulic, 若该子类最终被客户端访问,就public,否则protected
abstract class Person{
protected $name;
protected function __construct( $name='五竹' ){
$this->name = $name;
}
# 需通过子类对象访问,应设为public
public function getName(){
return $this->name;
}
# 修改属性方法,设为抽象方法,交给子类实现
abstract protected function setName($value);
}
# 当子类继承 抽象父类,普通方法,可直接使用,抽象方法,须重新实现。
class Stu extends Person{
# 注意: 构造方法不会自动继承, 须手动重写
public function __construct( $name='五竹' ){
parent::__construct($name);
}
# 类实例化后,调用此方法,就直接调用,跟抽象方法没关系。
public function setName($value){
$this->name = $value;
}
}
$stu0 = new Stu();
echo '我么的感情,我看不见: ' . $stu0->getName() . '<br>';
$stu = new Stu('闲哥');
echo '才气逼人的小痞哥: ' . $stu->getName() . '<br>';
$stu->setName('滕子京');
# 用setName传值后,值给到父抽象类里的$name,用父抽象类的getName方法可以输出传值
echo '不专业的小杀手: ' . $stu->getName() . '<br>';
echo '<hr>';
# 接口中仅允许出现: 方法与常量
# 接口的方法可见性必须是: public
# 接口中的方法,必须全是抽象方法
# 抽象和接口区别:
# 抽象可以有抽象方法,普通方法,成员变量。
# 接口只有抽象方法,没有普通方法,成员变量。
# 普通类/抽象类 实现接口: implements, 接口继承接口:extends
# 类可 同时 继承 和实现 (先继承,在实现)
# 接口 可同时 继承多个接口,用逗号隔开
interface Ski1{
const COUNTRY = '中国';
# 驱动方式
public function setFuel($fuel);
}
interface Ski2{
# 用途
public function setPurpose($purpose);
}
interface Level extends Ski1, Ski2{
# 等级
public function setLevel( $level );
}
class Story implements Level{
public $fuel;
public $purpose;
public $level;
# 构造方法
public function __construct($fuel='隐身衣', $purpose='风速逃跑', $level='黄金'){
$this->fuel = $fuel;
$this->purpose = $purpose;
$this->level = $level;
}
# 必须实现的接口方法
public function setFuel($fuel){
$this->fuel = $fuel;
}
# 必须实现的接口方法
public function setPurpose($purpose){
$this->purpose = $purpose;
}
# 必须实现的接口方法
public function setLevel($level){
$this->level = $level;
}
# 类中自定义的对象方法
public function getInfo(){
return $this->fuel . $this->purpose . '<br>等级:' .$this->level. '<br>';
}
public function getConst(){
return self::COUNTRY;
}
}
# 客户端代码
$story = new Story();
echo $story->getConst();
echo $story->getInfo();
$story->setFuel('宝塔');
$story->setPurpose('镇河妖');
$story->setLevel('青铜');
echo $story->getInfo();
echo '<hr>';
# 若暂时只实现接口中的部分方法, 可用一个抽象来实现这个接口
# 否则,就必须全部把接口中方法全部实现
interface Skill{
const COUNTRY = '中国';
# 驱动方式
public function setFuel($fuel);
# 用途
public function setPurpose($purpose);
}
abstract class Auto implements Skill{
public $fuel;
# 只实现接口中的setFuel()方法, 另一个方法并未实现
public function setFuel($fuel){
$this->fuel = $fuel;
}
}
# 再创建一个类,来继承扩展这个抽象类 Auto
class Story1 extends Auto{
public $purpose;
# 构造方法
public function __construct($fuel='隐身衣', $purpose='风速逃跑'){
$this->fuel = $fuel;
$this->purpose = $purpose;
}
# 这个方法原来在接口中声明的,在它继承的抽象类中并没有声明
public function setPurpose($purpose){
$this->purpose = $purpose;
}
# 自定义的方法
public function getInfo(){
return $this->fuel . $this->purpose . '<br>';
}
}
$story1 = new Story1();
echo $story1->getInfo();
$story1->setFuel('金箍棒');
$story1->setPurpose('专打白骨精');
echo $story1->getInfo();