Java61

greenspun.com : LUSENET : Grundlæggende Programmering F2001 : One Thread

I class Cube kan den ikke extende Tank, hvorfor kan den ikke det. Når jeg skifter Vessel ud med Tank kan den ikke (cannot) resolve symbol. Hvad er der galt?

MVH Claus Christiansen

// Opgave Java61 Flere beholdere Løbeseddel 8 // Af Claus Christiansen // Instruktør Søren Edourd Jacobsen

public class Java61 { static boolean empty(Vessel[] vs) { int j=0; for (int i=0;i abstract class Vessel { double contents;

abstract double volume();

abstract double circumf();

public void fill(double amount) { contents = contents + amount; contents = Math.min(contents, volume()); } }

class Tank extends Vessel { double length, width, height;

Tank(double length, double width, double height) { this.length = length; this.width = width; this.height = height; }

double volume() { return length * width * height; }

double circumf() { return 2 * (width + length); } }

class Cube extends Vessel /*Tank*/ {// hvorfor kan den ikke extende Tank. Når jeg double length; // skifter Vessel ud med Tank kan den // kan den ikke (cannot) resolve symbol Cube(double length) { // i konstrukteren her. this.length = length; }

double volume() { return 3 * length; }

double circumf() { return 2 * ( 2 * length); } }

class Barrel extends Vessel { double radius, height;

Barrel(double radius, double height) { this.radius = radius; this.height = height; }

double volume() { return height * Math.PI * radius * radius; }

double circumf() { return 2 * Math.PI * radius; } }

-- Claus Christiansen (cc@it-c.dk), May 30, 2001

Answers

Det første en subklasses konstruktor gør er at kalde en af superklassens konstruktorer, og hvis ikke der er et eksplicit kald til super(...), så er der et implicit kald til super(), den argumentløse superklasse-konstruktor.

Men konstruktoren i din subklasse Cube kalder ikke super(...), så den forsøger at kalde super() i Tank. Men Tank har ikke nogen argumentløs konstruktor, så det kan oversætteren ikke acceptere.

Det du skal gøre er at lade Cube(int len) kalde super(len, len, len) for en Cube er jo netop en Tank der er lige stor på alle leder. For alt i verden skal du ikke have et felt length både i Tank og i Cube; konsekvensen er at Cube har fire felter: length, width, height og length, hvor to af felterne hedder det samme. Det fører til forvirring.

-- Peter Sestoft (sestoft@dina.kvl.dk), May 30, 2001.


Moderation questions? read the FAQ