You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
1.9 KiB

3 years ago
  1. <?php
  2. /**
  3. * 还不能掌握什么是协变
  4. * 创建了一个animal的抽象类,留了speak叫这个动作给子类具体化
  5. * 创建一个dog类,继承了animal类,并且具体化了叫这个类,狗会吠,猫会喵
  6. */
  7. abstract class Animal{
  8. protected string $name;
  9. public function __construct(string $name){
  10. $this->name=$name;
  11. }
  12. abstract public function speak();
  13. }
  14. class Dog extends Animal{
  15. public function speak(){
  16. echo $this -> name." barks".PHP_EOL;
  17. }
  18. }
  19. class Cat extends Animal{
  20. public function speak(){
  21. echo $this->name." meows".PHP_EOL;
  22. }
  23. }
  24. $doggy=new Dog("旺财");
  25. $doggy->speak();
  26. interface AnimalShelter{
  27. public function adopt(string $name):Animal;
  28. }
  29. class CatShelter implements AnimalShelter{
  30. public function adopt(string $name):Cat{
  31. return new Cat($name);
  32. }
  33. }
  34. class DogShelter implements AnimalShelter{
  35. public function adopt(string $name):Dog{
  36. return new Dog($name);
  37. }
  38. }
  39. $kitty=(new CatShelter)->adopt("ricky");
  40. $kitty->speak();
  41. $doggy=(new DogShelter)->adopt("lucky");
  42. $doggy->speak();
  43. class Food{}
  44. class AnimalFood extends Food{}
  45. abstract class Animal{
  46. protected string $name;
  47. public function __construct(string $name){
  48. $this->name=$name;
  49. }
  50. public function eat(AnimalFood $food){
  51. echo $this->name."eats".get_class($food);
  52. }
  53. }
  54. class Dog extends Animal{
  55. public function eat(Food $food){
  56. echo $this->name."eats".get_class($food);
  57. }
  58. }
  59. $kitty=(new CatShelter)->adopt("ricky");
  60. $catFood=new AnimalFood();
  61. $kitty->eat($catFood).PHP_EOL;
  62. $doggy=(new DogShelter)->adopt("lucky");
  63. $banana=new Food();
  64. $doggy->eat($banana);
  65. ?>