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