Klasy abstrakcyjne i interfejsy

Klasa abstrakcyjna jest to klasa której obiekty nie mogą być tworzone,może być natomiast dziedziczona.

Klasa abstrakcyjna może posiadać konstruktor jak i destruktor, mogą być one jednak wywołane tylko przez klasy pochodne.

Klasę abstrakcyjną tworzymy przy pomocy modyfikatora abstract

Dodatkowo klasa abstrakcyjna może posiadać funkcje abstrakcyjne, funkcja taka posiada liste argumentów, jednak nie posiada ciała.

Funkcje abstrakcyjne muszą zostać nadpisane w klasach pochodnych.

Tworzone są one również modyfikatorem abstract


<?php
abstract class Zwierze{
    protected $imie;
    public function __construct( $imie ){
        $this->imie = $imie;
    }
    final public function  podajImie(){
        return $imie;
    }
    abstract public function wydajOdglos();

}
class Slon extends Zwierze{
    public function __construct( $imie ){
        parent::__construct($imie);
    }
    public function wydajOdglos(){
        echo 'Turr-uuu';
    }
}
?>

Stworzyliśmy klase abstrakcyjną Zwierze która posiada konstruktor, jedną funkcje finalną i funkcję abstrakcyjną. Klasa Slon ktora dziedziczy klase abstrakcyjna Zwierze nadpisuje funkcje abstrakcyjna(musi to zrobic), jak i wywoluje konstruktor klasy abstarcyjnej w ciele swojego konstruktora. Nalezey pamietac ze klasa Slon nie moze nadpisac funkcji podajImie.

Interfejsy

Interfejs jest jakby mocnie abstrakcyjną klasą, może mieścić jedynie metody, które z założenia są abstrakcyjne.

Metody w interfejsie są domyślnie abstrakcyjne tak więc, wszystkie metody zawarte w interfejsie muszą zostać nadpisane w klasach pochodnych.

Przy pomocy interfejsów masz możliwość wymuszenia na klasach, aby posiadały niezbędne do współpracy z innymi elementami metody, tak więc intersejsy zapewniają określone cechy klasy.

Interfejs tworzymy słowem kluczowym interface

Klasy nie dziedzicza interfejsów, klasy je implemetują, dokonujemy tego używając modyfikatora implements po którym podajemy nazwy interfejów do zaimplementowania.

Do danej klasy możemy implementować dowoln± ilość interfejsów.

Interfejsy mogą dziedziczyć inne interfejsy.

Interfejsy nie mogą dziedziczyć ani implementować klas.


<?php
interface miesozerne{
    function zjedzMieso($mieso);
}
interface roslinozerne{
    function zjedzWarzywo($warzywo);
}
class Slon implements miesozerne,roslinozerne{
    //rozne wlasciwosci i metody
    function zjedzMieso($mieso){
        echo 'Ja slon zjadam '.$mieso;
    }
    function zjedzWarzywo($warzywo){
        echo 'Ja slon zjadam '.$warzywo;
}
}
interface wszystko extends miesozerne, roslinozerne {

}


?>

Stworzylismy dwa interfejsy, miesozerne i roslinozerne. Interfejsy te posiadają odpowiednio metody zjedzMieso jak i zjedzWarzywo. Tak więc klasy implementujące je muszą te metody nadpisac. Widzimy że klasa Slon implementuje interfejs miesozerne jak i roslinozerne, taki sam efekt moglibysmy otrzymac implementując interfejs wszystkozerne ktory dziedziczy po roslinozerne i miesozerne.

Różnice między klasami abstrakcyjnymi a interfejsami