2017-09-30 1 views
0

Ich habe eine Oberklasse namens Shape, meine Form Klasse hat eine Unterklasse namens 2DShape und 2DShape hat eine Unterklassen mit dem Namen Kreis, Quadrat.Aufruf Methoden von Unterklassen

Ich habe ein Array vom Typ Form geschaffen, um diese Objektreferenzen für die Formen

Shape [] shapes = new Shape[4]; 

shapes[0] = new Circle(22, 88 , 4, 0); 
shapes[1] = new Square(71, 96 , 0, 10); 

Mein Problem zu halten ist, dass ich nur die Methoden von meiner Shape-Klasse aufrufen können. Wie kann ich die Methoden aus meinen Square- und Circle-Klassen aufrufen? Beide haben eine Methode namens calcArea, die ich gerne aufrufen würde.

Ich erhalte eine Fehlermeldung „kann nicht Symbol finden“, wenn ich versuche, dieses

for (int i = 0; i < shapes.length; i++) { 


      System.out.println(shapes[i]); 
      shapes[i].calcArea(); 
} 
+0

können Sie Downcasting verwenden. –

+0

danke Jungs, es sieht aus wie ich muss – Carl

Antwort

0

Sie calcArea() als Methode in Shape definieren müssen; es kann eine abstrakte Methode, wie dies:

public abstract float calcArea(); 

und Sie werden dann diese Methode in jeder Unterklasse implementieren müssen. Es wird dann von jeder Unterklasse Shape ohne Gießen verfügbar sein.

+0

werfen Dies ist eine Schule Übung, die ich follwing, die Form-Klasse darf nicht haben eine calcArea(); Methode – Carl

+0

Dann müssten Sie jedes Objekt auf den richtigen Typ umwandeln, um die Methode aufzurufen. Es hört sich an, als hätte die Übung einen Fehler, oder Sie verstehen etwas von der Übung nicht, oder es gibt andere Informationen, die wir nicht haben, die sich auf Dinge auswirken. In der Schleife, die Sie oben haben, ohne irgendeine Möglichkeit, die Klasse zu kennen, in die Sie jeden Shape werfen müssen, sehe ich nicht, wie Sie das vernünftig tun werden. Sie können jedes Objekt mit 'instanceof' testen, um zu sehen, ob es eine bestimmte Klasse ist, aber das ist wirklich hässlich, und ich hoffe, dass es bei einem Problem, das Polymorphie zeigt, nicht erwartet wird. – arcy

+0

Ich habe gedacht, das war offensichtlich, aber vielleicht ist es nicht - das Problem, wie Sie beschreiben, ist * genau * was Polymorphismus ist für - ein Design, das für jede Form eine eigene Definition von 'calcArea (), so definiert die Oberklasse den "Vertrag" für den Erhalt dieses Bereichs (die Methodensignatur) und stellt sicher, dass jede Shape-Unterklasse über diese Methode verfügt und kein Casting benötigt wird. Casting ist eine mühsame Operation; Je nach Vererbungshierarchie kann es sehr lange dauern und einen Fehler auslösen, der schwierig zu testen ist. Ich weiß nicht, warum dich eine Übung daran hindern würde. – arcy

Verwandte Themen