Avatar billede mat Nybegynder
30. december 2002 - 17:08 Der er 16 kommentarer og
1 løsning

oprette subklasser

Hejsa

Jeg har et underligt problem synes jeg selv.

Jeg har en abstract "kunde"-klasse Kunde med en constructor og en masse setters og getters og yderligere to metoder, en der opretter objekter af klassen Lejekontrakt og gemmer disse i et List objekt.

Nu vil jeg så så lave to subklasser til Kunde - en Privatkunde og en Erhvervskunde. Selvom jeg opretter dem som helt tomme får jeg stadig "cannot resolve symbol". Hvis jeg laver metoder i subklasserne går fejlmeddelelsen på dem hvis ikke går den på selve klassedefinitionen?!?

Mit spørgsmål er så: hvad dælen gør jeg forkert?

Kunde oprettes med:

public abstract class Kunde
{ // yada yada yada }

subklassen Privatkunde ser så sådan her ud:

public class PrivatKunde extends Kunde
{
   
}

Jeg er nybegynder så jeg ved ikke hvor meget info i skal bruge for at hjælpe mig med mit problem, men i må bare sige til hvis i skal se hele kundeklassen eller dele af samme.

På forhånd tak

-mat
Avatar billede arne_v Ekspert
30. december 2002 - 17:18 #1
Lidt mere kode og den fuld efejlmeddelelse ville måske hjælpe.
Avatar billede arne_v Ekspert
30. december 2002 - 17:24 #2
Ligger filerne i samme directory og matcher fil og klasse-navne ?
Avatar billede mat Nybegynder
30. december 2002 - 17:27 #3
Hele kundeklassen ser sådan ud:


import java.util.List;
import java.util.LinkedList;

public abstract class Kunde
{
   
    private String navn;
    private String adresse;
    private String tlfNr;
    private String kørekortNummer;
    private List lejekontrakter;
   
    public Kunde(String navn, String adresse, String tlfNr, String kørekortNummer){
        this.navn = navn;
        this.adresse = adresse;
        this.tlfNr = tlfNr;
        this.kørekortNummer = kørekortNummer;
        this.lejekontrakter = new LinkedList();
    }
   
    public void setNavn(String navn) {
        this.navn = navn;
    }
   
    public String getNavn() {
        return this.navn;
    }
   
    public void setAddress(String adresse){
        this.adresse = adresse;
    }
   
    public String getAddress(){
        return this.adresse;
    }
   
    public void setTlf(String tlfNr) {
        this.tlfNr = tlfNr;
    }
   
    public String getTlf() {
        return this.tlfNr;
    }
   
   
    public void opretLejeKontrakt(int rabatStørrelse, String datoStart, String datoSlut, String kontaktPerson, int udlejerID, int ID) {
        LejeKontrakt l = new LejeKontrakt(rabatStørrelse, datoStart, datoSlut, kontaktPerson, udlejerID, ID);
        this.lejekontrakter.add(l);
    }
   
    public LejeKontrakt getLejeKontrakt(int ID) {
    LejeKontrakt ne = null;
    LejeKontrakt retur = null;
    for (int i = 0; i < lejekontrakter.size(); i++) {
        ne = (LejeKontrakt)lejekontrakter.get(i);
        if (ne.getID() == ID)
        {
            retur = ne;
            break;
        } 
        }
        return retur;
       
       
    }
}

og som nævnt ser privatkundeklassen sådan her ud:

public class PrivatKunde extends Kunde
{
   
}

Jeg bruger bluej som editor og det eneste jeg kan se af fejlmeddelelsen er "cannot resolve symbol" og den markerer så klasse definitionen.

Min anden subklasse til Kunde ser således ud:

public class Erhvervskunde extends Kunde 
{
  private String navn;
 
  public Erhvervskunde(String navn)
    {
        this.navn = navn;
    }

   
}

..og når jeg prøver at compile den får jeg samme fejlmeddelelse men bluej markerer curly brackets i constructoren.
Avatar billede tutma Nybegynder
30. december 2002 - 17:35 #4
Dine erklæringer i Kunde-klassen skal være protected, ikke private.
Avatar billede mat Nybegynder
30. december 2002 - 17:36 #5
(det var nu der skulle være colorcoding på eksperten :)

alle filer ligger i samme mappe og filnavne og klassenavne skulle osse passe - de er oprettet i bluej. Alle mine andre klasser spiller (men de arver heller ikke). Kunde compileres helt fint det er subklasserne der ikke rigtig vil som jeg vil.
Avatar billede mat Nybegynder
30. december 2002 - 17:42 #6
tutma > det ændrede ikke rigtigt noget? Selvom jeg gør dem public får jeg stadig samme fejlmeddelelse. Er nedarvning ikke muligt med private variabler?
Avatar billede arne_v Ekspert
30. december 2002 - 17:49 #7
Jeg tror at du enten skal:
  lave en constructor i Kunde uden argumenter
eller:
  kalde Kunde constructuren i PrivatKunde constructuren eksplicit
Avatar billede arne_v Ekspert
30. december 2002 - 17:50 #8
tutma> man kan sagtens have private members i en super klasse. Man kan
bare ikke bruge dem i sub-klasserne. Men det gør han jo helle rikke.
Avatar billede arne_v Ekspert
30. december 2002 - 17:54 #9
Jeg er ret sikke rpå at du vil have en constructor i PrivatKunde ligesom
i Kunde altså:

public PrivatKunde(String navn, String adresse, String tlfNr, String kørekortNummer){
    super(navn,adresse,tlfNr,kørekortNummer);
}
Avatar billede tutma Nybegynder
30. december 2002 - 17:59 #10
Ja, jeg tilslutter ,ig arne v, idet subklsser IKKE nedarver constructoren i superklassen
Avatar billede mat Nybegynder
30. december 2002 - 18:10 #11
en constructor uden argumenter i Kunde? vil den se sådan her ud:

public Kunde(){
}

..oder?

Hvordan kalder jeg den evt eksplicit. Skal alle instancevariablerne så initieres fra PrivatKundes constructor men stadig defineres i Kunde? 

Ja jeg vil gerne have en constructor i mine subklasser - Det er dem der instancieres jo, og hvis jeg ikke arver constructoren skal variablerne initieres der :) ..og hvis jeg aldrig opretter et Kunde objekt er en constructer der jo ret ligegyldig, eller hvad? puha nu synes jeg at jeg bliver forvirret :S
Avatar billede mat Nybegynder
30. december 2002 - 18:23 #12
Ok, det spiller hvis jeg har en constructor i Kunde der ser ud som mit første indlæg og så laver en constructor i subklasserne der ser således ud:

public Erhvervskunde(String navn, String adresse, String tlfNr, String kørekortNummer, String forretning)
    {
        super(navn, adresse, tlfNr, kørekortNummer);
        this.forretning = forretning;
    }

..så det er jo bare herligt - men er det korrekt?

og lige en lillebitte ting mere: arver man osse imports? altså skal jeg importere Lists i mine subklasser osse?
Avatar billede mat Nybegynder
30. december 2002 - 18:41 #13
okidoki - det ser ud til at det kører nogenlunde nu :P - mange tak for hjælpen.
Avatar billede arne_v Ekspert
30. december 2002 - 20:48 #14
Dit sidste forslag til constructor for Erhverskunde er lige
præcis sådan man gør det.
Avatar billede arne_v Ekspert
30. december 2002 - 20:52 #15
Nej man arver ikke imports.

Imports gælder kun for den fil man sætter dem ind i.
Avatar billede arne_v Ekspert
30. december 2002 - 20:58 #16
Mange er forvirrede over import.

Import gør "ingenting" overhovedet.

Du kan skrive:

  java.util.HashMap mymap = new java.util.HashMap();

eller:

  import java.util.HashMap;

  HashMap mymap = new HashMap();

og de gør det samme.

import er rent convenience for at kunen bruge kortere navne
i ens kilde kode.
Avatar billede mat Nybegynder
30. december 2002 - 22:53 #17
Ok, så fik jeg lige den med også - endnu engang tusind tak for hjælpen :)
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