我试图更好地理解 Liskov 原则使用的类不变性。
我知道像 D 这样的一些语言对 invariant 有本机支持,但是,在 PHP 中使用断言我尝试将魔法方法和断言结合起来:
<?php
class Person {
protected string $name;
protected string $nickName;
protected function testContract(){
assert(($this->name != $this->nickName));
}
public function __construct(string $name, string $nickName){
$this->name = $name;
$this->nickName = $nickName;
}
public function __set($name, $value){
$this->testContract();
$this->$name = $value;
}
public function __get($name){
$this->testContract();
return $this->$name;
}
}
class GoodPerson extends Person {
public function getFullName(){
return $this->name." ".$this->nickName. "!!!";
}
}
class BadPerson extends Person {
protected function testContract(){
assert(($this->name != ""));
}
}
$gp = new GoodPerson("João", "Joãozinho");
echo $gp->nickName;
echo $gp->getFullName();
$bp = new BadPerson("João", "João");
echo $bp->nickName;
- 我可以使用断言来创建合同吗?
- BadPerson 是 Liskov 对继承的 Class Invariance 违反的有效示例吗?
- GoodPerson 是 Liskov 的类不变性的有效例子吗?