更新时间2019年1月21日
在本教程中,我们将学习多态性(希腊语中的“多种形式”)一种命名约定,它可以帮助我们编写更加连贯且易于使用的代码。根据多态性原则,执行类似事务的不同类中的方法应该具有相同的名称。
根据多态性原则,执行类似事务的不同类中的方法应该具有相同的名称。
一个主要的例子是表示几何形状(如矩形,圆形和八边形)的类,这些几何形状在肋的数量和计算它们的面积的公式中彼此不同,但它们都有一个共同的区域,可以是通过一种方法计算。该多态性原理说,在这种情况下,所有的计算面积的方法(和它没有关系的,其形状或类)将具有相同的名称。
例如,我们可以调用计算区域calcArea()的方法,并决定在每个表示形状的类中放置一个具有此名称的方法,该方法根据形状计算区域。现在,每当我们想要计算不同形状的面积时,我们就会调用一个名为calcArea()的方法,而不必过多关注如何实际计算不同形状面积的技术。我们唯一需要知道的是计算区域的方法的名称。
如何实现多态原理?
为了实现多态原则,我们可以在抽象类和接口之间进行选择。
为了确保类确实实现了多态性原则,我们可以在抽象类或接口的两个选项之一中进行选择。
在下面给出的示例中,名称为Shape的接口将提交实现它的所有类,以定义名为calcArea()的抽象方法。
1 2 3 | interface Shape { public function calcArea(); } |
根据,Circle类通过在calcArea()方法中输入计算圆的面积的公式来实现接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Circle implements Shape { private $radius; public function __construct($radius) { $this -> radius = $radius; } // calcArea calculates the area of circles public function calcArea() { return $this -> radius * $this -> radius * pi(); } } |
矩形类还实现了Shape接口,但使用适合矩形的计算公式定义方法calcArea():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Rectangle implements Shape { private $width; private $height; public function __construct($width, $height) { $this -> width = $width; $this -> height = $height; } // calcArea calculates the area of rectangles public function calcArea() { return $this -> width * $this -> height; } } |
现在,我们可以从具体类创建对象:
1 2 | $circ = new Circle(3); $rect = new Rectangle(3,4); |
我们可以确定所有对象都使用名为calcArea()的方法计算区域,无论是矩形对象还是圆形对象(或任何其他形状),只要它们实现Shape接口即可。
现在,我们可以使用calcArea()方法来计算形状的面积:
1 2 | echo $circ -> calcArea(); echo $rect -> calcArea(); |
结果:
28.274333882308
12