[Java] class Extends

Pagina: 1
Acties:
  • 43 views sinds 30-01-2008

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
We zijn op school bezig met een vak "Imperatief programmeren", met behulp van Java. We hebben het practicum van deze week gister heel mooi afgerond, en ik had er zin in en ben lekker bezig geweest met het practicum van aanstaande week. Bijna af, alleen werkt het laatste deel niet.

We hebben een interface 'Vergelijkbaar' gemaakt, eisend dat als een klasse Vergelijkbaar implementeerd, dat die klassen twee methoden heeft:
Java:
1
2
int compareTo (Vergelijkbaar t);
public String toString ();


Toen maakten we een klasse KalenderDatum. Samengevat (deze klasse is veel groter, een zooi members erin, maar niet noemenswaardig om hier te posten volgens mij):
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class KalenderDatum implements Vergelijkbaar {
  public KalenderDatum (String s) { // constructor
    // ..
  } // constructor

  public String toString () {
    return String.valueOf(day) + " " + month + " " + String.valueOf(year);
  } // toString

  public int compareTo (Vergelijkbaar other) {
    KalenderDatum test = (KalenderDatum) other;
    // if-rommel: deze methode doet het goed
    return 0;
  } // compareTo

} // class


Toen werd er gevraagd een klasse te maken die KalenderDatum uitbreidt. En nou juist dáár gaat het mis:

Java:
1
2
3
class Gebeurtenis extends KalenderDatum {
  [..]
} // Gebeurtenis


Ik krijg de volgende foutmelding:
code:
1
2
3
4
5
6
7
8
D:\\[..]\Sorteren\Gebeurtenis.java:1: cannot resolve symbol
symbol  : constructor KalenderDatum ()
location: class KalenderDatum
class Gebeurtenis extends KalenderDatum {
^
1 error

Process completed.


Ik heb al lopen zoeken, de Java-tutorial op java.sun.com doorgelezen, maar ik snap niet helemaal waar die foutmelding vandaan komt. Ook als ik Gebeurtenis met een zooi extra methoden maak, extra members (een in principe werkende klasse dus), geeft ie foutmeldingen. De klasse KalenderDatum werkt wel gewoon trouwens.

De klasse KalenderDatum staat in dezelfde directory als Gebeurtenis, dus volgens mij hoef ik niet te importen (??). Iig, als ik dat wel doe ('import Sorteren.*;'), dezelfde foutmelding.

Nou zou ik natuurlijk kunnen wachten tot maandag totdat we het college krijgen, maar ik heb zin deze opdracht klaar te hebben :) Sorry voor de waarschijnlijk te-newB-vraag, maar ik zie het niet.. Wie helpt me aan een fijn begin van het weekend? Thanx :o

edit:
Kijk, we leren elke dag iets nieuws :) [code=java] :)

[ Voor 4% gewijzigd door DRvDijk op 14-02-2003 11:41 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:37
Volgens de foutmelding heeft het te maken met de constructor van KalenderDatum.
Hoe ziet de constructor eruit van jouw Gebeurtenis class?


Trouwens, bestaat er in Java al niet zo'n interface 'vergelijkbaar'? (ICompareable ofzo?)

https://fgheysels.github.io/


  • Marcj
  • Registratie: November 2000
  • Laatst online: 17:51
Zitten ze wel in dezelfde map en package?
Of anders denk ik dat je de constructor niet goed hebt. Kun je even de constructor van de class Gebuirtenis laten zien?
whoami schreef op 14 februari 2003 @ 11:26:
Volgens de foutmelding heeft het te maken met de constructor van KalenderDatum.
Hoe ziet de constructor eruit van jouw Gebeurtenis class?


Trouwens, bestaat er in Java al niet zo'n interface 'vergelijkbaar'? (ICompareable ofzo?)
Comparable ja :)

[ Voor 62% gewijzigd door Marcj op 14-02-2003 11:29 . Reden: added url ]


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

KalenderDatum heeft een constructor met als argument een String. Roept Gebeurtenis deze constructor ook aan, mbv super () ?

.edit: ik was lekker eerder :P

[ Voor 14% gewijzigd door .oisyn op 14-02-2003 11:32 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Marcj
  • Registratie: November 2000
  • Laatst online: 17:51
Wat ik trouwens denk dat er gebeurt dat je in de constructor van Gebreurtenis geen super(String) aanroept. Als je dan je super-klasse niet construeert, dan doet java het zelf, maar java doet dat door super() aan te roepen. En jouw KalenderDatum-klasse heeft geen constructor zonder parameters :)

.edit: Maar ik geef wat meer info :P

[ Voor 7% gewijzigd door Marcj op 14-02-2003 11:33 ]


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Omdat kalenderdatum geen default constructor kent (zonder parameters dus) zul je hem in je subclasse moeten aanroepen dmv super( parameters ).

Misschien handig voor je logica als ik er ook bij vertel waarom:
Als jij een klasse B maakt die een andere classe (A) extends, dan breid je die classe A dus uit. Als jij dus een instantie van je classe B maakt moet het gedeelte dat van A afkomstig is 'geinitialiseerd' worden. Dat gebeurt natuurlijk met de constructor.
Dus als jij de constructor van B aanroept, dan wordt eerst de constuctor van A aangeroepen, voordat de code die in de constructor van B staat wordt aangeroepen.

Nu kan A natuurlijk meerdere constructoren hebben en de compiler weet niet welke hij kan aanroepen. Hell, hij heeft helemaal geen idee van de betekenis van je parameters dus hij kan eigenlijk alleen A's constructor zonder argumenten aanroepen.
Nu rijst het probleem: wat nou als A geen constructor zonder argumenten heeft?
Dan moet je dus zelf aangeven welke constructor je van A wilt aanroepen met welke argumenten.
Dat doe je dmv super( [argumenten] )

VB:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class A {

   public A( String s ) {
   
     doetIetsMetS( s );
   }
}

public class B extends A {

   public B( String s ) {
      
     super( s );
  }
}


Let er op dat super( [argumenten] ) altijd de eerste opdracht van je constructor moet zijn (immers eerst A initaliseren) en dat als er geen super() hoeft te staan (omdat A een default constructor zou hebben) de compiler die er stiekem zelf neerzet :)

edit:
Wat zijn jullie allemaal onvolledig joh! :+

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Constructor van KalenderDatum:
Java:
1
2
3
4
5
6
7
8
  public KalenderDatum (String s) {
    StringTokenizer tokens = new StringTokenizer (s);
    String dayStr = tokens.nextToken ();
    day = Integer.parseInt (dayStr);
    month = tokens.nextToken ();
    String yearStr = tokens.nextToken ();
    year = Integer.parseInt (yearStr);
  } // KalenderDatum


Constructor van Gebeurtenis is nog brak :P, maar ziet er nu zo uit:

Java:
1
2
3
  public Gebeurtenis (String s) {
    System.out.println("blah");
  } // Gebeurtenis


Dan 'is' het toch een goeie constructor? Hoe zit dat dan met super()? Ff naar gaan zoeken zo :)

Zelfde map en package: beide klassen zitten niet in een package, het zijn .java-bestanden in 1 directory (Sorteren).

Compareable.. leuk om te weten :) Maar ze zijn eigenwijs bij ons op school: We moesten zelfs een klasse schijven om ints in op te slaan:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class MyInt implements Vergelijkbaar {

  private int val;

  MyInt (String s) {
    val = Integer.parseInt (s);
  } // constructor


  public int value () {
    return val;
  } // value


  public String toString () {
    return String.valueOf (val);
  } // toString 

  public int compareTo(Vergelijkbaar other) {
    MyInt test = (MyInt) other;
    if (test.value() > val) return -1;
    else {
      if (test.value() < val) return 1;
      else return 0;
    } // else
  } // compareTo


} // MyInt


Hoe onbenullig kan het worden ofzo :P

edit: Ow, ff Glimi's post lezen :P Duidelijk! :)

[ Voor 8% gewijzigd door DRvDijk op 14-02-2003 11:48 ]


  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Fijn het werkt :) Thanx!

Ik heb dus ff een default constructor gemaakt in KalenderDatum. KalenderDatum heeft 3 members, int day, year; en String month; (moet volgens de opgave |:(). Deze zijn als private gedeclareerd. Nou wil ik er wel bij vanuit Gebeurtenis (extends KalenderDatum dus :)). Moet ik ze dan opnieuw declareren in Gebeurtenis?

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
P&W is niet echt de plek voor een basiscursus programmeren. Ik zou je willen adviseren het te leren uit je boek van school, of tutorials te lezen over OO technieken.
Voor dit probleempje wil ik je nog wel wijzen op dit stukje : [rml]Glimi in "[ /14] nette code release versie *FAQ Upd"[/rml] en dan punt 2. Dan moet het lukken.

Succes verder en veel leerplezier!
Pagina: 1

Dit topic is gesloten.