Nhiều giao diện trong OOP PHP
Trong PHP không có tính kế thừa đa cấp - mỗi
lớp chỉ có thể có một lớp cha.
Tuy nhiên, với các giao diện, mọi thứ lại khác:
mỗi lớp có thể triển khai bất kỳ số lượng
giao diện nào. Để làm điều này, tên các giao diện
cần được liệt kê, phân tách bằng dấu phẩy, sau từ khóa
implements.
Đây là một điểm khác biệt nữa giữa giao diện và lớp trừu tượng - bạn có thể triển khai nhiều giao diện, nhưng không thể kế thừa nhiều lớp trừu tượng.
Hãy thử thực hành. Giả sử ngoài
giao diện iFigure, chúng ta còn có
giao diện iTetragon.
Các phương thức của giao diện này sẽ được triển khai bởi
các lớp Quadrate và Rectangle,
vì chúng có 4 cạnh, nhưng không phải lớp
Disk.
Giả sử giao diện iTetragon mô tả
các getter cho cả bốn cạnh
của tứ giác:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Giả sử chúng ta cũng có giao diện iFigure,
mà chúng ta đã làm trước đây:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Hãy làm cho lớp Quadrate
triển khai hai giao diện. Để làm điều này, chúng ta liệt kê
cả hai giao diện, phân tách bằng dấu phẩy, sau từ khóa
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// phần triển khai sẽ ở đây
}
?>
Bây giờ chúng ta sẽ phát triển lớp Quadrate của chúng ta,
để nó triển khai giao diện iTetragon.
Rõ ràng, hình vuông của chúng ta là một trường hợp đặc biệt
của tứ giác, bởi vì trong hình vuông
tất cả các cạnh đều bằng nhau. Do đó, tất cả các phương thức mới
sẽ trả về cùng một giá trị - độ dài cạnh của hình vuông:
<?php
class Quadrate implements iFigure, iTetragon
{
private $a;
public function __construct($a)
{
$this->a = $a;
}
public function getA()
{
return $this->a;
}
public function getB()
{
return $this->a;
}
public function getC()
{
return $this->a;
}
public function getD()
{
return $this->a;
}
public function getSquare()
{
return $this->a * $this->a;
}
public function getPerimeter()
{
return 4 * $this->a;
}
}
?>
Rõ ràng, trong hình chữ nhật không phải tất cả
các cạnh đều bằng nhau, mà chỉ các cạnh đối diện.
Trong trường hợp này, các phương thức mới sẽ có sự khác biệt
một chút. Và trong một hình thang
thì cả 4 cạnh đều sẽ khác nhau.
Tuy nhiên, không quan trọng chúng ta xem xét hình nào - điều quan trọng là tất cả các hình này sẽ có các phương thức được mô tả (ngay cả khi một số hình là trường hợp đặc biệt) và hoạt động theo cùng một kiểu.
Hãy làm cho lớp Rectangle
cũng triển khai hai giao diện: cả iFigure,
và iTetragon.
Tạo giao diện iCircle với các phương thức
getRadius và getDiameter.
Hãy làm cho lớp Disk cũng
triển khai hai giao diện: cả iFigure,
và iCircle.