Avatar billede Slettet bruger
06. august 2012 - 09:01 Der er 4 kommentarer og
1 løsning

OOP - tilgå variabler fra et under-instance

Hej eksperter.

Jeg er ved at lave et program i Objective-C men er lidt usikker på noget fundamental OOP, der overordnet set ikke er et specifikt Objective-C problem.
Here goes:

Jeg starter med (i initialiseringen) at oprette en række instances af klassen "Brugere". De lægges i et array ved navn "brugere"
Hver instance af Brugere (der også har tilknyttet en XIB) har en medlemsfunktion, der hedder "Næste bruger" og som aktiveres vha. en knap på brugerfladen.

Her er udfordringen: Når man trykker på knappen, har jeg brug for at vide, hvor mange brugere der er oprettet for at kunne vise brugerinterfacet for næste bruger og har derfor behov for at kunne tilgå array'et for at kunne tælle på dens længde.

Hvordan gør jeg det?


For at illustrere, meget overordnet:
Klassen "AntalBrugereViewController" opretter brugerinstances og definitionen er som følger:


#import <UIKit/UIKit.h>
#import "BrugerViewController.h"

@interface AntalBrugereViewController : UIViewController {
    short int antalBrugere;
    short int aktuelBruger;
   
    BrugerViewController *bruger; // Klassen Bruger
    NSMutableArray *brugere // Et array, der indeholder alle objekter af Bruger, så vi kan ha' mange af dem
}

@property (nonatomic, retain) NSMutableArray *brugere; // Vi skal kunne nå denne fra andre steder
@property (nonatomic, retain) BrugerViewController *bruger;


- (IBAction)vaelgAntalBrugere:(id)sender; // Man angiver manuelt, hvor mange brugere der er


@end


Her klassen, der oprettes brugere ud fra:
#import <UIKit/UIKit.h>

@interface BrugerViewController : UIViewController {
    short int brugernummer; // Fra 3-6
    short int antalForekomster;
    BOOL foersteGang;
    UIViewController *view;
}

@property short int brugernummer;
@property short int antalForekomster;
@property IBOutlet UILabel *toptekst;
@property (nonatomic, retain) UIButton *visNaesteBruger;

- (IBAction)vaelgTilfaeldigeForekomster:(id)sender;
- (IBAction)visNaesteBruger:(id)sender;
- (void) manuelInitialisering;
- (void) visSpiller;

@end


Som det ses, er det action "visNaesteBruger", der skal tælle variablen "aktuelBruger" én op (og hvis enden er nået, starte ved første bruger igen).

Array'et "brugere" bliver synthesized og har dermed getters og setters, men altså: hvordan tilgås de fra de instances, der bliver oprettet?
Avatar billede Panen Nybegynder
06. august 2012 - 09:44 #1
Jeg er ikke en haj til Objective-C, men jeg har lidt C# erfaring, og umiddelbart lyder det forkert at have en funktion til at vise næste bruger, på selve bruger-objektet?

Jeg tror du bør have et lag over dine brugerobjekter som blandt andet holder styr på mængden af brugere og som har funktioner til at vise næste osv.
Avatar billede Slettet bruger
06. august 2012 - 14:03 #2
Hej Panen og tak for din kommentar.

Kan du uddybe det lidt? Vi har
AntalBrugereViewController (den kan vi kalde Brugere) og
BrugerViewController (den kan vi kalde Bruger)

Brugere er den, der som bekendt opretter instances af Bruger

Hvis jeg forstår dig korrekt, vil du ha' visNaesteBruger metoden op i Brugere? Det ville jeg i så fald også ha' gjort, men jeg står stadig med problematikken om at tilgå medlemsvariabler fra Brugere i Bruger-objekterne.

Men al kommunikation skal måske køre gennem en række getters og setters?

Og er vi enige om at man ikke importerer metoderne fra Brugere i Bruger, da Bruger-objekterne i forvejen er oprettet af Brugere? Eller har jeg misforstået noget?
Avatar billede Panen Nybegynder
06. august 2012 - 14:16 #3
Brugere skal bare indeholde et array eller en liste over de oprettede Bruger-instanser. Derudover kan den indeholde nogle funktioner som foreksempel at navigere til næste bruger.

Bruger skal kun indeholde informationer om sig selv. Det kan være ID, Navn, Adresse, Mail, Telefon osv. De informationer kan du lave nogle Gettere og Settere på, så Brugere kan få fat i dem. Medminde de enkelte Bruger-instanser har relationer med hinanden.

Når du så på dit Brugere-lag opretter Bruger-instanser, smider du dem i et array eller en liste.
På den måde kan du iterere igennem listen af oprettede Bruger-instanser og hente data ud om dem fra deres Gettere og Settere :)
Avatar billede Slettet bruger
07. august 2012 - 08:08 #4
OK, fint. Det er også sådan, det er lavet.

Variablen NSMutableArray *brugere holder styr på objekterne og tilskrives i en løkke, lige så snart man har valgt antallet af brugere der skal oprettes.

Metoden, der vælger næste bruger, ville jeg umiddelbart placere i Brugere - for det er en fælles metode for alle Bruger-instances.
Imidlertid kan jeg vel ikke nå den metode fra mine instances, med mindre den er nedarvet?

Det er sådan, jeg har tænkt mig, det skal fungere:
http://www.imagevolume.com/diverse/brugerebruger.jpg

Til hver bruger oprettes samtidig et grafisk interface, som knappen (der kører metoden "visNaesteBrugerKnap") ligger på.

Men ved nærmere eftertanke... selve brugerinterfacet (som oprettes sammen med hver instance) bør vel flyttes til Brugere og så blot opdateres med de informationer, man "getter" fra sine instances?
Avatar billede Slettet bruger
05. juni 2013 - 18:00 #5
//Lukker
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
Kurser inden for grundlæggende programmering

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