Avatar billede googolplex Novice
14. november 2003 - 16:19 Der er 15 kommentarer og
1 løsning

Klasser - hvilken metode er bedst

Hvis jeg har en klasse:

class A
{
    function foo();
    {
        // Do something
    }
}

Hvis jeg derefter ønsker at bruge metoden foo() i en ny klasse, hvad er så bedst (og hvorfor):

DETTE

class B extends A
{
    function bar()
    {
        $result = $this->foo();
    }
}

ELLER

class B
{
    function bar()
    {
        $object = new A();
        $result = $object->foo();
    }
}

Altså, er det bedst at lave klassen B som en udvidelse af A, eller er det bedre at oprette et object af klassen A i klassen B.

Håber det giver mening :-)
Avatar billede solom Nybegynder
14. november 2003 - 16:37 #1
du skal bruge extends (arver fra) når klassen B er en modificering af klassen A.

f.eks.
class bygning{
...
}

class rækkehus extends bygning{
...
}

class højhus extends bygning{
...
}

class villa extends bygning{
...
}

så har du i klassen bygning de attributter og metoder de enkelte klasser rækkehus, højhus og villa har til fælles.

så hvis dinne klasser ligner hinanden brug extends.
Avatar billede googolplex Novice
14. november 2003 - 16:48 #2
Ja, det er jeg helt klar over :)

MEN, er det bedre at bruge 'extends' i forhold til at oprette et nyt object af klassen A i B ?

jeg har set begge dele benyttet.
Avatar billede solom Nybegynder
14. november 2003 - 17:16 #3
Jeg ved faktisk ikke hvad der er mest ressource krævende, men jeg kunne forestille mig det er "tungere" at oprette et objekt som opretter et andet objekt. Der er også den fordel med extends at det et sig selv man kalder metoden på
Avatar billede erikjacobsen Ekspert
14. november 2003 - 17:24 #4
det er vel ikke spørgsmålet om hvad der er mest resourcelkrævende, men
hvad der passer bedst til situationen.

En klasse: køretøj, har nogle egenskaber der gælder for alle køretøjer.
En bil er et specielt køretøj, og extender derfor køretøj. En lastbil er
også et køretøj, men en anden slags, og extender derfor køretøj. En invalidebil
extender måske en bil.

Men inde i en bil er der 4 hjul, så derfor opretter man (måske) vi delobjekter,
af klassen: hjul.
Avatar billede erikjacobsen Ekspert
14. november 2003 - 17:25 #5
Stavefejl er gratis. Men "vi delobjekter" sku' ha' vær't "fire delobjekter"
Avatar billede olebole Juniormester
14. november 2003 - 23:32 #6
<ole>

Hva' dælen, olde ... kan du nu ikke engang huske dine romertal længere? De var da ellers sidste skrig, da du gik ud af skolen ... eller var det lige efter?  ;oD
Fire skrives omvendt - og med store bogstaver: 'IV' ikke 'vi'  :)

/mvh
</bole>
Avatar billede erikjacobsen Ekspert
14. november 2003 - 23:37 #7
Joh, gamle dreng. Men bogstaverne "vi" sidder i rygmarven - det er
jo min yndlingseditor. Editoren der bærer dyrets tal: vi vi vi
Avatar billede googolplex Novice
16. november 2003 - 23:07 #8
Hmm, det blev jeg ikke så meget klogere af :(

MEN, måske I kan svare mig på dette i stedet...:

class C extends B {}

$ojb = new C();

1. Når jeg gør dette, bliver BÅDE B's og C's constructor så kaldt eller kun C's ?

2. Hvis B desuden extender A og B overrider en metode fra A, arver C så A's eller B's version af metoden ?
Avatar billede erikjacobsen Ekspert
16. november 2003 - 23:21 #9
1) Der står i http://www.php.net/manual/en/language.oop.constructor.php
  Du bør definere constructors i alle klasser, og skal så selv kalde overklassens constructor
2) C vil arve B's version af funktionen

(Husk at andre OO-sprog kan gøre tingene anderledes - vi snakker PHP!)
Avatar billede googolplex Novice
16. november 2003 - 23:36 #10
1) Vil det sige, at jeg skal have constructors i både A og B og så kalde A's constructor via B's constructor ELLER skal jeg kalde den som $obj_af_b->A(); ?)
Avatar billede erikjacobsen Ekspert
16. november 2003 - 23:38 #11
Det før ELLER
Avatar billede googolplex Novice
16. november 2003 - 23:45 #12
Skal lige være helt sikker :)

Er dettte korrekt:

class A
{
    function A()
    {
        // Initialize some class A stuff
    }
}

class B extends A
{
    function B()
    {
        $this->A();
        // Initialize som class B stuff
    }
}

Smid et svar !!
Avatar billede googolplex Novice
17. november 2003 - 15:14 #13
erikjacobsen: Svar og svar ?
Avatar billede googolplex Novice
18. november 2003 - 00:10 #14
Vil du ikke være rar at lægge et svar, så du kan få dine point :)

Jeg vil desuden være taknemmlig hvis du vil fortælle mig, om jeg har gjort det korrekt i ovenstående eksempel ?
Avatar billede googolplex Novice
19. november 2003 - 16:16 #15
ericjacobsen: Kan jeg slet ikke lokke et svar ud af dig, pleeease ?

Vil gerne lukke spørgsmålet og give dig dine point :)
Avatar billede googolplex Novice
21. november 2003 - 23:00 #16
Nå, det må du jo selv om...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester