Avatar billede r_ibsen Nybegynder
12. marts 2004 - 11:51 Der er 9 kommentarer

virtual function / abstract function

Hej,

jeg er helt ny i det her javascript-helvede, så hvis nogen vil vejlede mig lidt, vil jeg være meget taknemmelig.

Jeg ønsker at oprette en superklasse Observer med følgende egenskaber:

- Man kan ikke oprette objekter af typen Observer (ikke et ufravigeligt krav).

- Alle klasser der nedarves fra Observer skal implementere funkcionen update(), men hvordan de i øvrigt gør dette, er op til den enkelte klasse.

- Hvis jeg har et array af objekter der tilhører en klasse nedarvet fra Observer, vil jeg gerne kunne gøre noget i stil med

for(var i = 0; i < observers.length; i++){
  observer.update();
}

For at gøre en lang historie kort ønsker jeg at lave hvad der i C++ kaldes en virtuel funktion (og jeg mener det kaldes en abstract funktion i Java).

På forhånd tak

PS. Målet er at implementere noget i stil med Observer fra GOF-bogen.
Avatar billede r_ibsen Nybegynder
12. marts 2004 - 11:52 #1
Der skulle selvfølgelig stå

observers[i].update();
Avatar billede mm12010 Nybegynder
12. marts 2004 - 12:16 #2
Avatar billede r_ibsen Nybegynder
12. marts 2004 - 12:23 #3
Det er mit indtryk, at det ikke er velset at lave samme indlæg i flere kategorier?
Avatar billede =maddog= Nybegynder
12. marts 2004 - 14:26 #4
JavaScript har prototype nedarvning
function Obsever(n) {
    this.n = n;
    this.update = function(val) {
        this.n=val;
    }
}

function ImageObserver() {
    //
}
ImageObserver.prototype = new Observer; // Arve fra Observer

Er du SIKKER på at du mener JavaScript og ikke Java.
Avatar billede r_ibsen Nybegynder
12. marts 2004 - 15:02 #5
Tak for svaret.
Jeg tror nu at jeg har indset, at alle mine bekymringer er overflødige, fordi skidtet fortolkes i stedet for at blive oversat. Jeg troede det var nødvendigt at benytte et interface (i stil med Java) for at kunne gøre

function f(object){
  object.update();
}

hvor det ikke er helt fastlagt hvilken type object har, men da javascript fortolkes og er så løst typet, er det nok lige meget.
Skriv et svar, så du kan få nogle point.

Mvh
Avatar billede =maddog= Nybegynder
12. marts 2004 - 15:36 #6
JavaScript forsøger automatisk at lave et typecast. Hvis du vil være sikker på at object i dit eksempel ret faktisk er en Observer skal du gøre det omvendt af hvad du plejer
function f(object){
  if(!(object instanceof Observer)) throw new Error("Illegal argument. Not an Observer");
  object.update();
}

Her er et illustrativt eksempel
<script>
function Observer(n) {
    this.n = n;
    this.update = function(val) {
        this.n=val;
    }
}

function ImageObserver(n) {
    this.src=n;
}
ImageObserver.prototype = new Observer; // Arve fra Observer
myObj = new ImageObserver("b");
myObj.update("a");
alert(myObj.n);
alert(myObj.src);
alert(myObj.constructor);
alert(myObj instanceof Observer);

function f(object){
  if(!(object instanceof Observer)) throw new Error("Illegal argument. Not an Observer");
  object.update("Funktionen kørt");
}
f(myObj);
alert(myObj.n);
f("e");
</script>
Avatar billede =maddog= Nybegynder
12. marts 2004 - 15:50 #7
En anden lille ting. Der er intet umiddelbart i JavaScript der forhindrer at konstruktorer bliver kørt som funktioner!! Det kan være meget uheldigt, men der er råd for det.
<script>
function Observer(n) {
//    if(!(this instanceof Observer)) throw new Error("Object must be instantiated.");
    this.n = n;
    this.update = function(val) {
        this.n=val;
    }
}
Observer("n");
new Observer("n");
</script>

Prøv at køre det her. Fjern derefter udmarkeringen og prøv igen.
JavaScript er putativt objekt-orienteret, men kan køres funktions-orienteret. I Netscape/Mozilla er der virkelig mange ting man kan lave objekt-orienteret. Man kan for eksempel lave et objekt der arver fra <div>!
Avatar billede =maddog= Nybegynder
17. marts 2004 - 20:42 #8
tygger du stadig på det?
Avatar billede =maddog= Nybegynder
23. marts 2004 - 12:08 #9
Jeg bliver nød til at spørge om det er hensigten jeg skal have point? Ellers er det bedst at lukke for spørgsmålet.
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

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