Avatar billede dennish Nybegynder
06. oktober 2003 - 18:30 Der er 34 kommentarer og
1 løsning

gøre min kode lidt mere smart

Hej jeg har 4 forskellige klasser P1,P2,P3 og P4. De bruger alle sammen de samme metoder der laver set og get på forskellige variabler i klasserne. F.eks har jeg denne kode i alle mine klasser: Måske kan jeg lave noget polymorfi ??

public class P1
{

public int identifier = 10;

public int getIdentifier()
    {
        return identifier;
    }
   
    public void SetIdentifier(int id)
    {
        this.identifier = id;
    }
}
Avatar billede Slettet bruger
06. oktober 2003 - 18:34 #1
Lad P være ovenstående klasse.

Benyt

public class P1 extends P {}

til at erklære de andre klasser.

Alt hvad der er fælles for alle klasserne kan du lægge i P.
Avatar billede repsak Nybegynder
06. oktober 2003 - 18:34 #2
Lav en:
abstract class AbstractP{
protected int identifier = 10;

protected int getIdentifier()
    {
        return identifier;
    }
   
    protected void SetIdentifier(int id)
    {
        this.identifier = id;
    }
}

class P1 extends AbstractP{
...
}

noget i den stil?
Avatar billede jakoba Nybegynder
06. oktober 2003 - 18:35 #3
Når nu din variabel 'identifier' er public er der vel egentlig slet ikke nogen grund til at lave get- og set- metoder til at få adgang til den med.
dvs istedetfor
    int hansIdentifyer = instansAfP1.getIdentifyer();
kan du blot skrive
    int hansIdentifyer = instansAfP1.identifyer;

Kort of til at forstå.

mvh JakobA
Avatar billede repsak Nybegynder
06. oktober 2003 - 18:39 #4
jakoba -> korrekt, men det er nu pænere design hvis den bliver private (protected)
Avatar billede Slettet bruger
06. oktober 2003 - 18:40 #5
JakobA: Det er vel ikke pænt at give direkte adgang til variablerne i en klasse. Den pæne løsning er vel at gøre variablen private, og lade public metoder der kun tillader de operationer du øsnker på variablen.
Avatar billede arne_v Ekspert
06. oktober 2003 - 18:40 #6
repsak>

Jeg forstår ikke helt pointen i at lade metoderne være protected - det
giver da ikke samme funktionalitet.
Avatar billede Slettet bruger
06. oktober 2003 - 18:41 #7
Polymorfi vil sige at have flere metoder med samme navn, men med forskellige argumenter. Det burde ikke være nødvendigt hvis du bare vil dele fælles metoder.
Avatar billede repsak Nybegynder
06. oktober 2003 - 18:43 #8
jjust -> mener du ikke overloading?
Avatar billede arne_v Ekspert
06. oktober 2003 - 18:43 #9
P.java

public class P {
  private int identifier = 10;
    public int getIdentifier() {
        return identifier;
    }
    public void SetIdentifier(int id) {
        this.identifier = id;
    }
}

P1.java:

public class P1 extends P {
  ...
}

må være det rigtige.

Evt. kan member være protected, hvis den skal bruges direkte af metoder i Px.
Avatar billede arne_v Ekspert
06. oktober 2003 - 18:44 #10
jjust>

Polymorfi er ikke det samme som operator overloading.
Avatar billede repsak Nybegynder
06. oktober 2003 - 18:44 #11
arne_v -> hvad vil du ellers gøre med metoderne?
Avatar billede Slettet bruger
06. oktober 2003 - 18:46 #12
repsak: Jo, jeg gør :)
Avatar billede arne_v Ekspert
06. oktober 2003 - 18:47 #13
public selvfølgelig, når de er public i før synes jeg at det er mest logisk
at de også er public bagefter - ellers har man da ændret funktionaliteten
voldsomt.
Avatar billede repsak Nybegynder
06. oktober 2003 - 18:47 #14
arne_v du har heller ikke lavet class P abstract?
Avatar billede arne_v Ekspert
06. oktober 2003 - 18:49 #15
Der er ikke nogen abstrakte metoder, så det er ikke strengt nødvendigt.

Så spørgsmålet om den skal erklæres abstrakt eller ej afhænger jo af om det
giver mening at instantiere et objekt af typen eller ej.

Og jeg ved ikke om man kan have en P.
Avatar billede repsak Nybegynder
06. oktober 2003 - 18:51 #16
ja - jeg antog bare at P stod for Person eller sådan noget (og en Person er ofte abstract)  :-)
Avatar billede dennish Nybegynder
06. oktober 2003 - 19:06 #17
Ok jeg havde ikke lavet metoderne private, men jo det skal de være.
Avatar billede arne_v Ekspert
06. oktober 2003 - 19:08 #18
Hvorfor have private metoder der laver så lidt ?
Avatar billede jakoba Nybegynder
06. oktober 2003 - 19:09 #19
repsac >> når han nu skriver den er public så må man vel tro ham :-))

Hvis det er mang forskellige variable der skal tilgås med samme sæt funktioner i hver klasse kan du lave lidt smart snavs:

    String variableIDenneKlasse = "|identifier1    |tanteOda        |identifier2    |";

Og så en fælles lille klasse de andre extendes udaf:

class TilgaaVariable {

    String variableIDenneKlasse;

    private int findVariabelIndex ( String variabelNavn ) {
        String temp = "|" + variabelNavn + "                ";
        temp = temp.substring( 0, 17 ) +"|";
        int iTemp = variableIDenneKlasse.indexOf( temp );
        if ( iTemp < 0 ) return iTemp;
        return (iTemp/17);
    }

} // endclass TilgaaVariable.

i dine klasser sætter du så en konstantværdi i 'variableIDenneKlasse' med nabnene på de variabler der skal kunne nås i den klasse.
og naver en enkelt get- og set- funktion med en svitch statement i:

class EnAfDineKlasser extends TilgaaVariable {

    private int identifier1;
    private int tanteOda;
    private int identifier2;  // disse 3 skal kunne tilgås

    public EnAfDineKlasser()
        String variableIDenneKlasse =
            "|identifier1    |tanteOda        |identifier2    |";
        // plus hvad ellers constructoren skal lave.
    }

    public int getInt( String name ) {
        switch ( findVariabelIndex( navn ) ) {
            case 0: return this.identifier1;
            case 1: return this.tanteOda;
            case 2: return this.identifier2;
            default: {
                // kast en exeption eller
                System.out.println( "Der er ingen variabel med navnet '"
                                    +navn +" i denne klasse." );
                return 0;
            }
    }

    og ligesådan laver du en set metode.

}

udefra kan du så finde værdien at 'tanteOda' med
        int hansIdentifyer = instansAfP1.getInt("tanteOda");

og andre klasser kan så lave med de samme eller andre variable som du vil.

ret ubrugeligt. men grumme 'smart'

mvh JakobA
Avatar billede dennish Nybegynder
06. oktober 2003 - 20:15 #20
jakoba>> jeg kan godt se hvor du vil hen, men synes nu godt koden er en smule grum. Jeg kan ikke engang extende en super klasser, hvor hver klasse P1 .. P4, har hver deres egen variabel som skal skrives til. Hvis jeg extendede vil der jo kun være 1 variabel og ikke 4 som jeg skal bruge. Nå men vil ligge rode lidt med din kode.
Avatar billede dennish Nybegynder
06. oktober 2003 - 20:15 #21
øhh mener vil lige og ligge
Avatar billede arne_v Ekspert
06. oktober 2003 - 20:21 #22
Med al respekt for Jakob så synes jeg ikke at du skal vælge den kode
at arbejde videre på.
Avatar billede dennish Nybegynder
06. oktober 2003 - 20:29 #23
arne v>> hmm men hvad gør jeg så. Jeg kan jo ikke extende for hver klasse har jo sin egne variabler. Har du nogle forslag ?
Avatar billede arne_v Ekspert
06. oktober 2003 - 20:31 #24
Du kan da godt extende en basis klasse og så lade de afledte klasser
have sine egne variable.
Avatar billede dennish Nybegynder
06. oktober 2003 - 20:34 #25
arne V>> ja det er rigtigt, men getIndentifier() og setIdentifier(), læser og skriver variabler i 4 forskellige klasser. Men metoderne jeg har implementeret i de 4 klasser er ens. Den eneste forskel , at hver klasse har en variabel som skal skrives i selve klassen
Avatar billede arne_v Ekspert
06. oktober 2003 - 20:39 #26
Øh.

Er det ikke det som sker når man extender ?
Avatar billede dennish Nybegynder
06. oktober 2003 - 20:44 #27
arne>> jo men. Lad os nu antage at jeg først kalder metoden setIdentifier() fra min klasse P1 Så skriver jeg i variablen private int identifier. Senere kalder min klasse p2 metoden setIdentifier() som også skriver i variablen identifier og det dur jo ikke for så overskrives variablen identifier
Avatar billede arne_v Ekspert
06. oktober 2003 - 20:55 #28
Sådan fungerer extend ikke.

En instans variabel eksisterer for hvert objekt.

D.v.s. at o1, o2 og o3 har hver sin identifier (uasnset om det er P1, P2 og P3
klasser eller 3 gange P1 klasse).
Avatar billede dennish Nybegynder
06. oktober 2003 - 20:59 #29
arne V>> hmm er ikke helt med hvad mener. Kan du ikke smide lidt kode.
Avatar billede arne_v Ekspert
06. oktober 2003 - 21:04 #30
public class Arv {
    public static void main(String[] args) {
        P o1 = new P1();
        o1.setIdentifier(1);
        P o2 = new P2();
        o2.setIdentifier(2);
        P o3 = new P1();
        o3.setIdentifier(3);
        System.out.println(o1.getIdentifier());
        System.out.println(o2.getIdentifier());
        System.out.println(o3.getIdentifier());
    }
}

class P {
    private int identifier;
    public int getIdentifier() {
        return identifier;
    }
    public void setIdentifier(int id) {
        identifier = id;
    }
}

class P1 extends P {
}

class P2 extends P {
}
Avatar billede arne_v Ekspert
06. oktober 2003 - 21:04 #31
Output:

1
2
3
Avatar billede arne_v Ekspert
06. oktober 2003 - 21:06 #32
Men måske er den her mere realistisk:

public class Arv {
    public static void main(String[] args) {
        P o1 = new P1();
        P o2 = new P2();
        P o3 = new P1();
        System.out.println(o1.getIdentifier());
        System.out.println(o2.getIdentifier());
        System.out.println(o3.getIdentifier());
    }
}

class P {
    private int identifier;
    public P(int id) {
        identifier = id;
    }
    public int getIdentifier() {
        return identifier;
    }
}

class P1 extends P {
    public P1() {
        super(1);
    }
}

class P2 extends P {
    public P2() {
        super(2);
    }
}
Avatar billede arne_v Ekspert
06. oktober 2003 - 21:06 #33
Output:

1
2
1
Avatar billede dennish Nybegynder
06. oktober 2003 - 21:21 #34
arne v>> du har da så ganske ret. Har været lidt væk fra kodning i et stykke tid. Smider du ikke lige et svar. Takker for hjælpen
Avatar billede arne_v Ekspert
06. oktober 2003 - 21:32 #35
svar
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