Sobes.tech
Junior

Mis on abstraktse klassi olemus?

sobes.tech AI

Vastus AI-lt

Abstraktne klass toimib kui mall teiste klasside jaoks. Seda ei saa otse luua, kuid see võib sisaldada abstraktseid meetodeid (ilma kehas), mida alamklassid peavad rakendama, ning ka konkreetseid meetodeid ja omadusi.

Peamised omadused:

  • Ei saa luua eksemplari: new AbstraktneKlass() põhjustab vea.
  • Pärimine: ainult pärimine (extends).
  • Abstraktsed meetodid: määratlevad liidese, mida alamklassid peavad rakendama. Märgitud sõnaga abstract ning neil pole keha.
  • Konkreetseid meetodeid ja omadusi: saab määratleda ja kasutada otse ning neid saab alamklassides üle kirjutada.
  • Osaline rakendamine: pakub üldist struktuuri ja teatud baasfunktsionaalsust, detailid jäävad alamklassidele.

Näide:

<?php

abstract class Kuju {
    protected $värv;

    public function __construct($värv) {
        $this->värv = $värv;
    }

    abstract public function arvutaPindala(); // Abstraktne meetod

    public function saaVärv() {
        return $this->värv;
    }
}

class Ring extends Kuju {
    private $raadius;

    public function __construct($värv, $raadius) {
        parent::__construct($värv);
        $this->raadius = $raadius;
    }

    public function arvutaPindala() {
        return pi() * $this->raadius * $this->raadius;
    }
}

class Ruut extends Kuju {
    private $külg;

    public function __construct($värv, $külg) {
        parent::__construct($värv);
        $this->külg = $külg;
    }

    public function arvutaPindala() {
        return $this->külg * $this->külg;
    }
}

// Kasutamise näide
$ring = new Ring("Punane", 5);
echo "Ring: pindala: " . $ring->arvutaPindala() . ", Värv: " . $ring->saaVärv() . "\n";

$ruut = new Ruut("Sinine", 4);
echo "Ruut: pindala: " . $ruut->arvutaPindala() . ", Värv: " . $ruut->saaVärv() . "\n";

// Järgmine kood põhjustab vea: Fatal error: Instantiating an abstract class
// $abstraktneKuju = new Kuju("Määramata");

Võrdlustabel liideste ja tavaliste klasside kohta:

Omadus Abstraktne klass Liides Tavaline klass
Objekti loomine Ei Ei Jah
Pärimine Jah (extends) + rakendamine (implements) Ainult rakendamine (implements) Jah (extends)
Meetodid Konkreetsed ja abstraktsed Ainult abstraktsed (ilma kehas) Ainult konkreetsed
Omadused Jah Ei Jah
Mitme pärimise võimalus Ei Jah Ei
Otstarve Osaline rakendamine, üldine struktuur Lepingu määratlus (käitumine) Täielik rakendamine, konkreetne objekt

Kasutatakse, kui on ühine loogika ja omadused, mis peavad olema seotud klasside vahel, kuid nende konkreetne käitumine (meetodite rakendamine) erineb. Tagab koodi korduvkasutuse ja ühtse struktuuri.