Avatar billede maqhem Nybegynder
07. december 2006 - 20:10 Der er 19 kommentarer og
2 løsninger

Metoders metoder

I Flash er indbygget en klasse kaldt System. Den har blandt andet en metode kaldt capabilities - som igen har en metode, eksempelvis hasAudio, som kalder en variabel.

Hvordan laver man sådanne "undermetoder", eller hedder de måske "nestede metoder"?
Avatar billede mat Nybegynder
07. december 2006 - 20:16 #1
System er en mappe (eller en package om du vil), det er capabilities der er en klasse, du kan selv finde den i din classes folder i din installation.


mvh mat
Avatar billede barklund Nybegynder
07. december 2006 - 20:22 #2
capabilities er ikke en metode - det er en klasse, som bare er lidt spøjst navngivet :)

Derudover er der intet der forhindrer dig i at lave funktioner på en funktion :)

var f:Function = function() { trace("f"); };
f.a = function () { trace("a"); };
f.a.b = function () { trace("b"); };
f();
f.a();
f.a.b();

Du kan se klassebeskrivelsen her:

http://livedocs.macromedia.com/flash/8/main/00002046.html

Der kommer dog intet fornuftigt ud af at lave metoder på metoder, men man kan godt - Function er faktisk en "dynamic" klasse, så man kan have egenskaber på den uden de er definerede i klassedefinitionen (ligesom MovieClip).

--
Morten Barklund
Avatar billede maqhem Nybegynder
07. december 2006 - 20:22 #3
Så man kan ikke lave sådanne klasser, eksemepelvis:

var minMand:Klasse = new Klasse();
minMand.navn = "Erik Hansen";
minMand.generelInfo.job = "Butiksassistent";
minMand.generelInfo.hjem.vej = "Sjovervej 99";
minMand.generelInfo.hjem.by = "Lykkeland";

?
Avatar billede maqhem Nybegynder
07. december 2006 - 20:23 #4
Aha, tak Barklund :)

Læg et svar.
Avatar billede maqhem Nybegynder
07. december 2006 - 20:29 #5
Hov, vent.

Det er nok bare mig, der er lidt for hurtig... Men se hér:

    public function set _xPoint(setX:Number):Void {
        xP = setX;
    }
    var nonInfluencing:Function = new Function();
    public function set nonInfluencing._xPoint(setX:Number):Void {
        xP = setX;
    }

Dette giver fejl.
Den er ikke initialiseret på samme måde som dine metoder, men kan jeg godt gøre det på samme måde som din? I så fald, hvordan?
Avatar billede mat Nybegynder
07. december 2006 - 20:54 #6
noget så elegant som;

class T {
   
    private var what:Function;
   
    public function T() {
        what = new Function();
        what.speak = function(s:String) {
            trace("stop doing that" + s);
        }
        speak(" please");
    }
    public function speak(s:String) {
        what.speak(s);
    }
}

?...ach :)
Avatar billede maqhem Nybegynder
07. december 2006 - 21:07 #7
Vi kommer tættere på. Nu blot et problem, der forårsager et andet:

1. Der er blevet defineret en funktion speak, som kan kaldes som både *.what.speak og *.speak.
Forårsaget problem: Jeg kan ikke splitte det op, så jeg har en *.what.speak og en *.speak. Jeg vil gerne have, at begge ting er mulige :)
Avatar billede maqhem Nybegynder
07. december 2006 - 21:08 #8
... men hvor det selvfølgelig ikke er samme metode.
Avatar billede maqhem Nybegynder
07. december 2006 - 21:09 #9
En ting mere: Så længe, what er private, kan funktionen kun kaldes *.speak();
Avatar billede maqhem Nybegynder
07. december 2006 - 21:18 #10
Dette minder lidt om, hvad jeg vil have:

class T {
    public function T() {
        trace("initialized");
    }
    public function what():Void {
        trace("what");
        function speak():Void {
            trace("what.speak");
        }
    }
    public function speak():Void {
        trace("speak");
    }
}

Men man kan blot ikke kalde what.speak();
Avatar billede maqhem Nybegynder
07. december 2006 - 21:19 #11
Denne kan så godt få what og what.speak til at du, men overskriver vidst speak:

class T {
    public function T() {
        trace("initialized");
    }
    public function what():Void {
        trace("what");
        this.speak = function():Void {
            trace("what.speak");
        }
    }
    public function speak():Void {
        trace("speak");
    }
}

Typisk.
Avatar billede maqhem Nybegynder
07. december 2006 - 21:20 #12
Dér var den!

class T {
    public function T() {
        trace("initialized");
    }
    public function what():Void {
        trace("what");
        what.speak = function():Void {
            trace("what.speak");
        }
    }
    public function speak():Void {
        trace("speak");
    }
}

Så nemt, og alligevel så kringlet.
Avatar billede maqhem Nybegynder
07. december 2006 - 21:21 #13
Tak for tiden, I brugte på det. I fortjener nu jeres point alligevel. Smid et svar begge to, så skal I få lidt hver :)
Avatar billede mat Nybegynder
07. december 2006 - 22:30 #14
Men hvorfor vil du gøre sådan?
Avatar billede maqhem Nybegynder
08. december 2006 - 05:56 #15
Hvorfor jeg vil lave metoders metoder?
Simpelt: Jeg har en klasse med en lang række metoder, samt tilsvarende "ikke-metoder", hvis man kan kalde dem det. I hvert fald metoder, der skal hedde det samme, dog med et "ikke" foran metodens navn eksempelvis. For jeg har metoder, der kan sætte x-, y- og z-værdier. Hvis jeg sætter x-værdien i sig selv, skal det enten kunne påvirke eller ikke påvirke de andre koordinater. Derfor har jeg en _xPoint og en nonInfluence._xPoint.

Jeg finder dette langt mere overskueligt, og man bygger jo oftest koden op efter overskuelighed, så den er nem at redigere i og benytte som færdig klasse bagefter :)

Hvis du vil spørge, hvorfor jeg brugte en lidt hjemmebrygget metode, må jeg dertil svare, at jeg ikke kunne få din til at du ordentligt, men derimod duede mig efter min hensigt. Dog kan man ikke initialisere som set eller get mere, men det går nok. Jeg har nemlig ikke nonInfluence._xPoint, der kan læse uden af påvirke, for det gør de i forvejen ;)
Avatar billede mat Nybegynder
08. december 2006 - 09:18 #16
Hvorfor ikke bare sende en parameter med til din metode om hvorvidt den skal influere andre koordinater;

setXCoord(x, true); // eller false.

?
Avatar billede barklund Nybegynder
08. december 2006 - 12:10 #17
maghem, det lyder som det mærkeligste, jeg længe har set - find en god bog om design patterns og brug det til at finde sædvanlige metoder til at løse specifikke problemer - din løsning her er meget unormal og fuldstændig uforståelig for dig selv og alle andre om en måned :)

Og et svar
Avatar billede maqhem Nybegynder
08. december 2006 - 15:50 #18
Nej, nej, tro mig, det er det smarteste for mig. :)

Og nej, jeg kan ikke bare sende en parameter mere med, for jeg har alle følgende:

set _xPoint
get _xPoint
(set) nonInfluence._xPoint

Desuden skal kun jeg redigere i koden, og jeg forstår det selv udemærket :)

Jeg kan i øvrigt ikke se, hvorfor det er så mærkeligt, men det er jo op til din vurdering.

Og så siger du noget om en god bog om design patterns... Kan du anbefale én/et par stykker, og eventuelt fortælle, hvad det er, jeg køber, når jeg køber en sådan bog?

Husk også du, mat, at lægge et svar.
Avatar billede mat Nybegynder
08. december 2006 - 15:58 #19
En femmer på at du kan ;)

Og jeg er helt enig med Barklund, det er ikke en pæn måde at gøre det på, og den er heller ikke smart i henhold til performance.

Design patterns er afprøvedede måder at tilgå almidelige problemstillinger i programarkitektur. Og en ualmindelig god ide at studere. En søgning på "design patterns" i google burde give læsestof til et par dage :)

mvh mat
Avatar billede maqhem Nybegynder
08. december 2006 - 16:01 #20
Ja, okay, det kan jeg godt, men det vil jeg ikke. Jeg læser lidt op på design patterns i stedet for :)
Avatar billede barklund Nybegynder
09. december 2006 - 15:23 #21
Tark for points - jeg vil nu stadig mene, at det ikke er den bedste løsning - og når du selv kommer tilbage til det om en måned aner du ikke, hvad det går ud på. :)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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