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ą
AbstractShape
implementują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.