Klasy abstrakcyjne a typy wariantne
Założenie: Zrozumieć, jak wykorzystać typy wariantne w klasach abstrakcyjnych w PHP, aby stworzyć elastyczną i skalowalną hierarchię klas.
Krok po kroku:
- Definicja interfejsu: Zdefiniujmy interfejs reprezentujący kształt geometryczny.
- Klasa abstrakcyjna: Stwórzmy klasę abstrakcyjną
AbstractShapeimplementującą interfejsShape. - Klasy potomne: Zaimplementujmy klasy potomne reprezentujące konkretne kształty (np. koło i prostokąt).
- Użycie typów wariantnych: Możemy teraz użyć typów wariantnych (union types) aby zadeklarować zmienną, która może przechowywać obiekty różnych klas dziedziczących po
AbstractShape.
interface Shape {
public function getArea(): float;
}
Ten interfejs definiuje metodę getArea(), która zwraca pole powierzchni kształtu.
abstract class AbstractShape implements Shape {
public abstract function getArea(): float;
}
Klasa abstrakcyjna AbstractShape deklaruje abstrakcyjną metodę getArea(), którą muszą zaimplementować klasy potomne.
class Circle extends AbstractShape {
private float $radius;
public function __construct(float $radius) {
$this->radius = $radius;
}
public function getArea(): float {
return pi() * $this->radius * $this->radius;
}
}
class Rectangle extends AbstractShape {
private float $width;
private float $height;
public function __construct(float $width, float $height) {
$this->width = $width;
$this->height = $height;
}
public function getArea(): float {
return $this->width * $this->height;
}
}
Klasy Circle i Rectangle implementują metodę getArea(), zwracając odpowiednio pole koła i prostokąta.
function calculateArea(AbstractShape $shape): float {
return $shape->getArea();
}
$circle = new Circle(5);
$rectangle = new Rectangle(4, 6);
echo "Pole koła: " . calculateArea($circle) . PHP_EOL;
echo "Pole prostokąta: " . calculateArea($rectangle) . PHP_EOL;
Funkcja calculateArea przyjmuje obiekt typu AbstractShape i zwraca jego pole. Dzięki typom wariantnym, możemy przekazać do niej zarówno obiekt Circle, jak i Rectangle.
Ten przykład pokazuje podstawowe wykorzystanie klas abstrakcyjnych i typów wariantnych w PHP. Zachęcamy do dalszego zgłębiania tematu, aby lepiej zrozumieć zasady kowariancji i kontrawariancji w kontekście programowania obiektowego.