Klasy abstrakcyjne a typy przecięcia
Założenie: Pokażemy, jak wykorzystać typy przecięcia w definicjach klas abstrakcyjnych w PHP, aby narzucić implementację wielu interfejsów jednocześnie.
Krok po kroku:
- Definicja interfejsów: Zdefiniujmy dwa interfejsy:
Drawable
iMovable
. - Klasa abstrakcyjna: Stwórzmy klasę abstrakcyjną
Shape
, która implementuje oba interfejsy. - Klasa potomna: Utwórzmy klasę
Circle
dziedziczącą poShape
. - Użycie klasy: Utwórzmy obiekt klasy
Circle
i użyjmy jej metod.
interface Drawable {
public function draw(): string;
}
interface Movable {
public function move(int $x, int $y): void;
}
Te interfejsy definiują metody, które muszą być zaimplementowane przez klasy, które je implementują.
abstract class Shape implements Drawable, Movable {
abstract public function getArea(): float;
public function move(int $x, int $y): void {
// Implementacja domyślna dla przesuwania kształtu
echo "Przesunięto kształt o ($x, $y)
";
}
}
Klasa Shape
implementuje metody z interfejsów Drawable
i Movable
. Metoda getArea()
jest abstrakcyjna, co oznacza, że musi być zaimplementowana w klasach potomnych.
class Circle extends Shape {
private float $radius;
public function __construct(float $radius) {
$this->radius = $radius;
}
public function getArea(): float {
return pi() * $this->radius * $this->radius;
}
public function draw(): string {
return "Narysowano koło o promieniu " . $this->radius;
}
}
Klasa Circle
implementuje metodę abstrakcyjną getArea()
i metodę draw()
z interfejsu Drawable
.
$circle = new Circle(5);
echo $circle->draw() . "
";
echo "Pole koła: " . $circle->getArea() . "
";
$circle->move(10, 20);
Ten kod tworzy koło o promieniu 5, rysuje je, oblicza jego pole i przesuwa.
Ten przykład pokazuje, jak używać typów przecięcia w klasach abstrakcyjnych, aby narzucić implementację wielu interfejsów. To pozwala na tworzenie bardziej elastycznych i dobrze zorganizowanych struktur w kodzie. Zachęcamy do dalszego zgłębiania tematu programowania obiektowego w PHP!