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:

  1. Definicja interfejsu: Zdefiniujmy interfejs reprezentujący kształt geometryczny.
  2. 
    interface Shape {
      public function getArea(): float;
    }
    				

    Ten interfejs definiuje metodę getArea(), która zwraca pole powierzchni kształtu.

  3. Klasa abstrakcyjna: Stwórzmy klasę abstrakcyjną AbstractShape implementującą interfejs Shape.
  4. 
    abstract class AbstractShape implements Shape {
      public abstract function getArea(): float;
    }
    				

    Klasa abstrakcyjna AbstractShape deklaruje abstrakcyjną metodę getArea(), którą muszą zaimplementować klasy potomne.

  5. Klasy potomne: Zaimplementujmy klasy potomne reprezentujące konkretne kształty (np. koło i prostokąt).
  6. 
    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.

  7. 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.
  8. 
    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.

Dodaj komentarz 0

Your email address will not be published. Required fields are marked *