Avatar billede Bennysørensen Praktikant
24. juli 2003 - 13:00 Der er 18 kommentarer og
1 løsning

Nedarvning i Java

Jeg kan ikke finde fejlen her...jeg får en "cannot resolve Symbol" på  Square firkant = new Square(100);
            ^
Begge filer ligger i samme package, og der plejer ikke at være noget galt med dét.

public class Rectangle
{
    protected double length;
    protected double width;
   
    public Rectangle(double l, double w)
    {
        length = l;
        width = w;
    }      //rectangle constructor

    public double calculateArea()
    {
        return length* width;
    }      //calculateArea()
   
    public class Square extends Rectangle      //subclass of rectangle
    {
        public Square(double side)
        {  super(side, side);  }
    }  //square
}

...og den anden...

public class TestSquare
{

    public static void main(String argv[])
    {
        Square firkant = new Square(100);
        System.out.println("square's areal er "+ firkant.calculateArea());
    }

}      //testSquare
Avatar billede tosssen Nybegynder
24. juli 2003 - 13:08 #1
Det er muligt at jeg ikke ved nok om Java, men så vidt jeg ved, så skal den nedarvede klasse Square stå uden for definitionen af Rectangle. Har du prøvet det?
Avatar billede arne_v Ekspert
24. juli 2003 - 13:09 #2
Du har erklret Square inden i Rectangle og derfor er dens navn
Rectangle.Square.

Derfor:

Rectangle.Square firkant = new Rectangle.Square(100);
Avatar billede tosssen Nybegynder
24. juli 2003 - 13:09 #3
public class Rectangle
{
    protected double length;
    protected double width;
   
    public Rectangle(double l, double w)
    {
        length = l;
        width = w;
    }      //rectangle constructor

    public double calculateArea()
    {
        return length* width;
    }      //calculateArea()
   
}

public class Square extends Rectangle      //subclass of rectangle
    {
        public Square(double side)
        {  super(side, side);  }
    }  //square
Avatar billede arne_v Ekspert
24. juli 2003 - 13:09 #4
Alternativt kan du flytte Square over i sin egen java fil.

Det er formentligt pænere.
Avatar billede arne_v Ekspert
24. juli 2003 - 13:12 #5
Derimod er det lidt tricky med at flytte den ned neden under Rectangle.

Man kan ikke have 2 public class'es i samme java fil. Derfor skal klassen
ændres fra public til package visibility.

Det kan man godt, men jeg tvivler på at det er hensigtsmæssigt med en
Rectangle med public visibility og en Square med package visibility.
Avatar billede tosssen Nybegynder
24. juli 2003 - 13:12 #6
Der er jeg enig med arne - jeg har aldrig set brugt at man erklærer en klasse inde i en anden klasse
Avatar billede arne_v Ekspert
24. juli 2003 - 13:15 #7
Det har jeg.

Det er sågar brugt enkelte steder i Java API'et.

Men det er forvirrende ad h til.
Avatar billede tosssen Nybegynder
24. juli 2003 - 13:16 #8
Hvis Square er erklæret inde i Rectangle, så kan man få adgang til Square ved Rectangle.Square
Når Square så nedarver fra Rectangle giver følgende så mening?
Rectangle.Square.Square
...eller:
Rectangle.Square.Square.Square.Square.Square
Avatar billede tosssen Nybegynder
24. juli 2003 - 13:18 #9
Er der nogen fordele ved at erklære en klasse inde i en anden?
Avatar billede arne_v Ekspert
24. juli 2003 - 13:19 #10
anders>

Vær iøvrigt lidt forsigtig med problem-stillingen Rectangle<->Square
og arv.

Det er ikke det bedste eksempel til arv.

Det er OK så længe du der ikke er metoder til at ændre dimensionerne.

Men hvis du tilføjer sådanne metoder er der problemer.

(da C.J.Date som var med til at opfinde relations databaser for 30
år siden skulle argumentere for at verden ikke er objekt orieneteret
valgte han lige præcis dette eksempel)
Avatar billede tosssen Nybegynder
24. juli 2003 - 13:24 #11
Hvordan er ekspertens regler egentlig mht. at jeg stiller spørgsmål inde i Anders' spørgsmål?
Avatar billede arne_v Ekspert
24. juli 2003 - 13:24 #12
tossen>

Jeg kan ikke se nogle fordele ved det.

Jeg mener at det bruges til at markere at inder-klassen kun giver
mening i forbindelse med over-klassen.

Eksempel:

java.io.ObjectInputStream.GetField

Mens jeg f.eks. ikke kan se pointen i:

java.awt.geom.Ellipse2D.Double
Avatar billede arne_v Ekspert
24. juli 2003 - 13:26 #13
Jeg mener ikke at det overtræder nogle regler at stille spørgsmål
inde i spørgsmål så længe det har noget med det oprindelige spørgsmål
at gøre.
Avatar billede Bennysørensen Praktikant
24. juli 2003 - 13:26 #14
Ok, det var bedst at lægge Square over i sin egen klasse. Jeg fik enelleranden underlig fejl, jeg ikke kan genskabe (og jeg har vist heller ikke lyst), da jeg brugte Rectangle.Square etc.


Tak for hjælpen, og (som sædvanligt :o) tak for jeres opklarende kommentarer...det er noget bedre end dé medkommentatorer, der bare lægger det rigtige kodeeksempel ind.

Kors, hvor er jeg træt af bøger med forkerte kodeeksempler!
Avatar billede tosssen Nybegynder
24. juli 2003 - 13:28 #15
Ok - det er altså et spørgsmål om overskuelighed for brugerne af den samling klasser man skriver.
Jeg vil dog mene at man overskuelighed og forståelse lige så nemt kan opnås ved at undgå at bruge for mange ukendte finesser i et sprog! Måske er det bare mig der endnu ikke kender Java godt nok ;-)
Avatar billede tosssen Nybegynder
24. juli 2003 - 13:32 #16
andersschroeder>> Det var så lidt! Det er jo diskussionen der gør eksperten.dk spændende!
Avatar billede arne_v Ekspert
24. juli 2003 - 14:09 #17
Jeg checkede lige og den syntax jeg angav for inner class var faktisk ikke
helt rigtig, da new på sådan en kræver en instans.

Følgende eksempel compiler og kører:

public class X {
    private int xv;
    public X() {
        xv = 123;
    }
    public void print() {
        System.out.println(xv);
    }
    public class Y {
        private int vy;
        public Y() {
            vy = xv + 1;
        }
        public void print() {
            System.out.println(vy);
        }

    }
    public static void main(String[] args) {
        X x = new X();
        x.print();
        X.Y xy = x.new Y();
        xy.print();
    }
}
Avatar billede arne_v Ekspert
24. juli 2003 - 14:09 #18
(men syntaxen er absolut ikke kønnere)
Avatar billede tosssen Nybegynder
24. juli 2003 - 14:19 #19
hehe nej ;-)
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