Sobes.tech
Junior

Na czym polega istota klasy abstrakcyjnej?

sobes.tech AI

Odpowiedź od AI

Cel główny klasy abstrakcyjnej polega na służeniu jako wzorzec dla innych klas. Nie można jej tworzyć bezpośrednio, ale może zawierać metody abstrakcyjne (bez ciała), które muszą być zaimplementowane w klasach pochodnych, a także metody i właściwości konkretne.

Kluczowe punkty:

  • Nie można utworzyć instancji: new KlasaAbstrakcyjna() spowoduje błąd.
  • Dziedziczenie: Można dziedziczyć tylko po klasie abstrakcyjnej (extends).
  • Metody abstrakcyjne: Definiują interfejs, który muszą zaimplementować klasy pochodne. Oznaczone słowem kluczowym abstract i nie mają ciała.
  • Metody i właściwości konkretne: Mogą być definiowane i używane bezpośrednio, a także nadpisywane w klasach pochodnych.
  • Częściowa implementacja: Zapewnia ogólną strukturę i pewną podstawową funkcjonalność, pozostawiając szczegóły implementacji klasom pochodnym.

Przykład:

<?php

abstract class Figura {
    protected $kolor;

    public function __construct($kolor) {
        $this->kolor = $kolor;
    }

    abstract public function obliczPole(); // Metoda abstrakcyjna

    public function pobierzKolor() {
        return $this->kolor;
    }
}

class Kolo extends Figura {
    private $promien;

    public function __construct($kolor, $promien) {
        parent::__construct($kolor);
        $this->promien = $promien;
    }

    public function obliczPole() {
        return pi() * $this->promien * $this->promien;
    }
}

class Kwadrat extends Figura {
    private $bok;

    public function __construct($kolor, $bok) {
        parent::__construct($kolor);
        $this->bok = $bok;
    }

    public function obliczPole() {
        return $this->bok * $this->bok;
    }
}

// Przykład użycia
$kolo = new Kolo("Czerwony", 5);
echo "Pole koła: " . $kolo->obliczPole() . ", Kolor: " . $kolo->pobierzKolor() . "\n";

$kwadrat = new Kwadrat("Niebieski", 4);
echo "Pole kwadratu: " . $kwadrat->obliczPole() . ", Kolor: " . $kwadrat->pobierzKolor() . "\n";

// Następujący kod spowoduje błąd krytyczny: tworzenie instancji klasy abstrakcyjnej
// $figuraAbstrakcyjna = new Figura("Nieznany");

Tabela porównawcza z interfejsami i zwykłymi klasami:

Cecha Klasa abstrakcyjna Interfejs Zwykła klasa
Tworzenie instancji Nie Nie Tak
Dziedziczenie Tak (extends) + Implementacja (implements) Tylko Implementacja (implements) Tak (extends)
Metody Konkretne i abstrakcyjne Tylko abstrakcyjne (bez ciała) Tylko konkretne
Właściwości Tak Nie Tak
Dziedziczenie wielokrotne Nie Tak Nie
Przeznaczenie Częściowa implementacja, ogólna struktura Definicja kontraktu (zachowania) Pełna implementacja, obiekt konkretny

Używa się, gdy istnieje wspólna logika i właściwości, które powinny należeć do grupy powiązanych klas, ale ich konkretne zachowanie (implementacja niektórych metod) się różni. Zapewnia wielokrotne użycie kodu i jednolitość struktury klas.