19. juni 2009 - 00:18Der er
4 kommentarer og 1 løsning
Abstrakte klasser i OOP - hvad gør de godt for?
Hej alle,
Jeg har lidt problemer med at se hvad abstrakte klasser gør godt for. Jeg har forsøgt med at lave et lille eksempel - forresten, jeg har lige kastet mig ud i OOP her for 5 dage siden, så er ikke så skrap endnu. Her kommer koden:
<?php abstract class Animal { // forskellige abstract public function sound();
// fælles public function eat() { return "Rooaarr - IM EATING!!!"; } }
class Dog extends Animal { public function sound() { return "WUFF :D"; } }
class Cat extends Animal { public function sound() { return "Miaauuuww... :)"; } }
Det virker fint. Men det gør det jo også hvis jeg sletter "abstract public function sound();" og laver Animal til en non-abstract klasse.
Her af hvad mit spørgsmål går ud på. Er abstrakte klasser, klasser hvor man kan gøre methods abstrake, hvor det vil sige, at det er nogen der SKAL redeclares? Er det formålet med abstrakte klasser? For at vise at det kun er nogen man kan "extends", og så skal alle abstracte methods redeclares? Eller er jeg helt galt på den?
Det er korrekt! En abstrakt klasse skal du extende, og implementere alle metoderne som er markeret som abstrakte i den abstrakte klasse :) Er der en abstrakt metode i en klasse, er klassen også abstrakt.
Du kan bruge det til mange ting, f.eks. et plugin-system, hvor der skal være nogle bestemte metoder til stede, så systemet kan bruge klassen.
Du kan også tænke på det som en måde at sikre basisinformation. F.eks. kan en person defineres som en abstrakt klasse, hvor navn, fødselsdato osv kan deklareres. Disse kan du så extende med forskellige finals, som f.eks. studerende, eller ansat, som har samme basisinformation, plus noget der er unikt for dem.
Et andet godt eksempel, er at lave databaseabstraktion. F.eks. en "generisk" abstrakt databaseklasse, der angiver at du skal implementere "query", "fetchrow" osv, og så lave en mysql-, og en oracle-klasse der extender denne.
Den modsatte er en "final" class, e.g.
final class Test { function __constructor() { echo "Initialiseret!"; } function Hello() { echo "Hello world"; } }
Denne klasse kan ikke extendes, pga. "final".
For at gøre forvirringen total, er der også "interfaces" - De er meget lig abstrakte klasser, men hvor abstrakte klasser kan indeholde ikke abstrakte metoder, men implementation, kan interfaces kun deklarere abstrate metoder uden implementation. Du kan både nedarve fra en klasse samtidigt med at du implementerer et interface ;) Oven i det, kan du extende interfaces for at lave mere avancerede interfaces.
interface a { public function blah(); }
interface b extends a { public function hat(); }
Hvis du implementerer "a" skal du skrive "blah"-metoden, og hvis du implementerer "b" skal du også skrive "hat"-metoden.
En klasse kan implementere flere interfaces.
Hmm. Interfaces er hvad du gerne vil have en klasse skal kunne, abstracts er for at få klassen til at høre sammen i grupper.
abstract class Menneske { public string $navn; abstract public function SkrivPåEksperten(); public function Dø() { echo "Øv jeg døde."; } }
abstract class Fugl { public string $latinskNavn; abstract public function ParringsDans(); public function Dø() { echo "Øv. Pipperen døde."; } }
interface ISpis { public function Spis(); }
interface IDans { public function Dans(); }
interface IFlyv { public function Spis(); }
class sandberg extends Menneske implements IDans, ISpis { ... }
class Musvit extends Fugl implements ISpis, IFlyv { ... }
Ok, jeg er træt - Jeg håber du fik lidt ud af det :P
Synes godt om
Slettet bruger
19. juni 2009 - 11:49#2
Mange tak for svaret :D - desværre er jeg ikke så skrap endnu, er kun lige nået til abstrakte klasser, jo. ;)
Men er da glad for jeg har styr på det. Så det ligesom er en "grundstruktur" for en anden klasse, hvor alle abstrakte metoder skal genlaves. :) Takker!
Synes godt om
Slettet bruger
19. juni 2009 - 11:54#3
Smid lige et svar for din gode hjælp, så du kan få poitsne :)
Værsågod - Håber det gav lidt klarhed - Jeg kan godt se, at det ser lidt sort ud, det jeg har skrevet - Jeg burde måske være gået i seng i stedet ;)
Synes godt om
Slettet bruger
19. juni 2009 - 12:40#5
Jeg kan bruge det senere i mit forløb i OOP. Men det er dejligt jeg har styr på abstrakte funktioner.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.