Avatar billede kristianp Nybegynder
22. august 2002 - 16:08 Der er 11 kommentarer og
1 løsning

this.getClass().getName() i en superklasse

Jeg har en klasse A og en klasse B, B nedarver fra A

package dk.test.print;

public class A
{

    public A(){

        System.out.println("This = " + this.getClass().getName());
    }

    public void aMethod(){
        System.out.println("This = " + this.getClass().getName());

    }
}




package dk.test.print;

public class B extends A
{

    public B(){

        System.out.println("This = " + this.getClass().getName());
    }

    public static void main(String args[]){
        B aB = new B();
        aB.aMethod();

    }
}


Outputtet af denne kode vil være:

java -classpath D:\test\dk\test\print\ dk.test.print.B
This = dk.test.print.B
This = dk.test.print.B
This = dk.test.print.B

Men når jeg står i A Klassen vil jeg gerne kunne finde frem til A klassens navn, altså så outputtet ville være


java -classpath D:\test\dk\test\print\ dk.test.print.B
This = dk.test.print.A
This = dk.test.print.B
This = dk.test.print.A

Kan det lade sig gøre ?
Avatar billede bearhugx Nybegynder
22. august 2002 - 16:19 #1
Du skal tænke på, at instansen, du arbejder med (this) stadigvæk er af klassen B - at den så bruger metoder fra superklasser ændrer ikke ved det faktum...

Jeg har ikke testet det, men hvis du insisterer på at få
  this=dk.test.print.A
som udskrift i A::aMethod, så gør følgende (bemærk  dog at det er et hack, som ikke ligger i tråd med oo-principper)

  public void aMethod() {
    System.out.println("This =" +(A)this.getClass().getName());
  }

BEMÆRK : Det er ikke testet - men idéen er at caste this (vilkårlig instans) om til et A-objekt, inden getClass() kaldes...

/Søren Munk Skrøder
Avatar billede dsj Nybegynder
22. august 2002 - 17:17 #2
Hvis ikke jeg tager helt fejl, skal du i stedet for "this" kalde "super":

public B(){

        System.out.println("This = " + super.getClass().getName());
    }
Avatar billede soelvpil Nybegynder
22. august 2002 - 17:21 #3
Desværre vil bearhugx's forslag stadigvæk blot skrive B.

Der er flere løsninger.

1. i A-klassen kan du skrive
public A(){
  System.out.println("This = " + A.class.getName());
}

ikke specielt pænt, men det virker.

2. i A-klassen kan du skrive
public A(){
  System.out.println("This = " + this.getClass().getSuperClass().getName());
}

lidt pænere. Det har dog den ulempe, at hvis du har en klasse C der arver fra B, vil der ikke stå A, men B i stedet for.

Jeg ville klart vælge løsning 1, det er vel også mest bare en test, for at se, hvordan nedarvning virker.
Avatar billede dsj Nybegynder
22. august 2002 - 17:23 #4
Mit forslag er vist det mest korrekte...
Avatar billede soelvpil Nybegynder
22. august 2002 - 17:32 #5
Havde ikke lige set dsj's forslag.

Det skriver også bare B'er.

En tredje løsning kunne være


package dk.test.print;

public class A
{

    public A(){

        System.out.println("This = " + this.getClass().getName());
    }

    public void aMethod(){
        System.out.println("This = " + this.getClass().getName());

    }

    public Class getClass() { return A.class;}
}




package dk.test.print;

public class B extends A
{

    public B(){

        System.out.println("This = " + this.getClass().getName());
    }

    public static void main(String args[]){
        B aB = new B();
        aB.aMethod();

    }

    public Class getClass() { return B.class;}
 
}
Avatar billede bearhugx Nybegynder
22. august 2002 - 19:23 #6
Ahhh... Så er eksperten oppe igen !
-----------------------------------

Jeg mener ikke at forslag hvor "super" inarbejdes vil virke særligt godt som f.eks.  dsj foreslår

Prøv at bemærk følgende :
  System.out.println("This = " + super.getClass().getName());

  "This =" må vel hentyde til den pågældende instans (dvs. en B instans)

når man så skriver B = super.getClass(), så vil jeg betragte det som forkert...

Hele situationen forekommer mig at være grebet helt forkert an... Det handler jo ikke om at der, for alt i verden, skal skrives This = A ... Derimod må det vel handle om at få en indikation om, hvilken klasse, den kode, som udføres, kommer fra...

Derfor burde det også være A som indikerer, at det er A som bruges -- og ikke B

Derudover vil dsj's kode også gå imod gode DP(Design Patterns)-praksis...
Et af mantraene i OO er nemlig Lav kobling... Her er det nemlig B som "gør rede" for A's tilstand - og ikke A selv... (derfor skabes en unødig høj afhængighed mellem A og B)...

Derfor vil jeg støtte soelvpil's kode #1 -- hvor A gøres ansvarlig for at gøre rede for sin egen tilstand...

Det tredje foreslag bryder jeg mig dog ikke om, da det tvinger _alle_ subklasser af A til at lave en egen implementation af getClass() -- Igen skabes en unødig afhængighed :-)

/Søren Munk Skrøder
Avatar billede bearhugx Nybegynder
22. august 2002 - 19:28 #7
Hmm - jeg håber ikke at det forrige lyder lidt "afstumpet" --- Problemet var bare, at eksperten var gået ned, da jeg svarede omkring 17:35 --- Og derfor blev mine ideer og betragninger "tabt i cyberspace"... Jeg har forsøgt at skrive, hvad mine betragtninger var, men når man bliver nød til at skrive sådan noget 2. gang, så bliver det _altid_ en vag kopi af det første...
Avatar billede dsj Nybegynder
22. august 2002 - 19:35 #8
bearhugx >> det var det han spurgte efter.
Avatar billede bearhugx Nybegynder
22. august 2002 - 19:42 #9
OK.. sætter det lige lidt på spidsen!

Hvis han, for alt i verden, ville have at der skulle stå
  "This = dk.test.print.A"

så ville det nemmeste jo være følgende
  System.out.println("This = dk.test.print.A");

:-))))))

Derfor vil jeg da også foreslå at B's constructor udformes således

  B() {
    super();
    System.out.println("This = " + this.getClass().getName());
  }

Så vil både A og B's constructor blive udført - istedet for kun B's :-)

/Søren
Avatar billede bearhugx Nybegynder
22. august 2002 - 19:44 #10
Øhh ... Der svarede jeg lige på to forskellige ting ... jeg er lidt distræt...

Udskift lige
  "Derfor vil jeg da også foreslå"
med
  "Jeg vil derudover også foreslå"
Avatar billede dsj Nybegynder
22. august 2002 - 19:53 #11
hehe
Avatar billede soelvpil Nybegynder
29. august 2002 - 22:49 #12
Hva så, lukker du spørgsmålet, eller skal vi skrive mere først???
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