Klassabstraktion

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Klassabstraktion

PHP har abstrakta klasser och metoder. Klasser som definieras som abstrakta kan inte instansieras, och alla klasser som innehåller minst en abstrakt metod måste också vara abstrakta. Metoder som definieras som abstrakta deklarerar endast metodens signatur; de kan inte definiera implementeringen.

När en klass ärver från en abstrakt klass måste alla metoder som är markerade som abstrakta i föräldrarklassens deklaration definieras av barnklassen och följa de vanliga reglerna för arv och signaturkompatibilitet.

Exempel #1 Abstrakt klassexempel

<?php
abstract class AbstractClass
{
    // Tvinga den ärvande klassen att definiera denna metod
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // Gemensam metod
    public function printOut() {
        print $this->getValue() . "\n";
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";
?>

Utdata från exemplet ovan:

ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2

Exempel #2 Abstrakt klassexempel

<?php
abstract class AbstractClass
{
    // Vår abstrakta metod behöver bara definiera de nödvändiga argumenten
    abstract protected function prefixName($name);
}

class ConcreteClass extends AbstractClass
{

    // Vår barnklass kan definiera valfria argument som inte finns i föräldrarnas signatur
    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>

Utdata från exemplet ovan:

Mr. Pacman
Mrs. Pacwoman

Sidslut

Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.oop5.abstract.php
PHP
Språkreferens
Språkreferens#Klasser_och_Objekt