Jetzt, nachdem Sie eine Vorstellung der Methoden haben, die für jeden Formtyp gleich sind, können Sie die Formklassen selbst definieren. Hinsichtlich der Anzahl der zu implementierenden Methoden ist die einfachste Form die im Folgenden aufgeführte Circle-Klasse:
package com.example.programmingas3.geometricshapes
{
public class Circle implements IGeometricShape
{
public var diameter:Number;
public function Circle(diam:Number = 100):void
{
this.diameter = diam;
}
public function getArea():Number
{
// The formula is Pi * radius * radius.
var radius:Number = diameter / 2;
return Math.PI * radius * radius;
}
public function getCircumference():Number
{
// The formula is Pi * diameter.
return Math.PI * diameter;
}
public function describe():String
{
var desc:String = "This shape is a Circle.\n";
desc += "Its diameter is " + diameter + " pixels.\n";
desc += "Its area is " + getArea() + ".\n";
desc += "Its circumference is " + getCircumference() + ".\n";
return desc;
}
}
}
Die Circle-Klasse implementiert die IGeometricShape-Schnittstelle, also müssen Sie einen Code für die Methoden
getArea()
und
describe()
bereitstellen. Darüber hinaus definiert sie die
getCircumference()
-Methode, die nur für die Circle-Klasse gilt. Die Circle-Klasse deklariert ebenfalls eine Eigenschaft,
diameter
, die in den anderen Polygonklassen nicht vorhanden sein wird.
Die anderen beiden Formtypen, Quadrate und gleichseitige Dreiecke, haben einige andere Gemeinsamkeiten: Bei beiden Typen sind die Seiten gleich lang und für beide können die gleichen Formeln zum Berechnen des Umfangs und der Summe der Innenwinkel verwendet werden. Tatsächlich gelten diese gemeinsamen Formeln auch für alle anderen regelmäßigen Polygone, die Sie noch definieren werden.
Die RegularPolygon-Klasse ist die übergeordnete Klasse der Square-Klasse und der EquilateralTriangle-Klasse. Mit einer übergeordneten Klasse können Sie allgemeine Methoden an einem Ort definieren, sodass Sie sie nicht in jeder untergeordneten Klasse erneut definieren müssen. Im Folgenden finden Sie den Code für die RegularPolygon-Klasse:
package com.example.programmingas3.geometricshapes
{
public class RegularPolygon implements IPolygon
{
public var numSides:int;
public var sideLength:Number;
public function RegularPolygon(len:Number = 100, sides:int = 3):void
{
this.sideLength = len;
this.numSides = sides;
}
public function getArea():Number
{
// This method should be overridden in subclasses.
return 0;
}
public function getPerimeter():Number
{
return sideLength * numSides;
}
public function getSumOfAngles():Number
{
if (numSides >= 3)
{
return ((numSides - 2) * 180);
}
else
{
return 0;
}
}
public function describe():String
{
var desc:String = "Each side is " + sideLength + " pixels long.\n";
desc += "Its area is " + getArea() + " pixels square.\n";
desc += "Its perimeter is " + getPerimeter() + " pixels long.\n";
desc += "The sum of all interior angles in this shape is " + getSumOfAngles() + " degrees.\n";
return desc;
}
}
}
Zuerst deklariert die RegularPolygon-Klasse zwei Eigenschaften, die alle regelmäßigen Polygone gemeinsam haben: die Länge jeder Seite (Eigenschaft
sideLength
) und die Anzahl der Seiten (Eigenschaft
numSides
).
Die RegularPolygon-Klasse implementiert die IPolygon-Schnittstelle und deklariert alle vier IPolygon-Schnittstellenmethoden. Sie implementiert zwei dieser Methoden (
getPerimeter()
und
getSumOfAngles()
) mithilfe gemeinsamer Formeln.
Da die Formel der
getArea()
-Methode je nach Form anders ist, kann die Basisklassenversion der Methode keine gemeinsame Logik enthalten, die von den Methoden der Unterklasse geerbt werden kann. Stattdessen gibt sie einfach eine 0 als Standardwert zurück und kennzeichnet so, dass die Fläche nicht berechnet wurde. Um die Fläche jeder Form korrekt zu berechnen, müssen die Unterklassen der RegularPolygon-Klasse die
getArea()
-Methode selbst übergehen.
Der folgende Code für die EquilateralTriangle-Klasse zeigt, wie die
getArea()
-Methode überschrieben wird:
package com.example.programmingas3.geometricshapes
{
public class EquilateralTriangle extends RegularPolygon
{
public function EquilateralTriangle(len:Number = 100):void
{
super(len, 3);
}
public override function getArea():Number
{
// The formula is ((sideLength squared) * (square root of 3)) / 4.
return ( (this.sideLength * this.sideLength) * Math.sqrt(3) ) / 4;
}
public override function describe():String
{
/* starts with the name of the shape, then delegates the rest
of the description work to the RegularPolygon superclass */
var desc:String = "This shape is an equilateral Triangle.\n";
desc += super.describe();
return desc;
}
}
}
Das Schlüsselwort
override
gibt an, dass die
EquilateralTriangle.getArea()
-Methode die
getArea()
-Methode der RegularPolygon-Unterklasse absichtlich überschreibt. Wenn die
EquilateralTriangle.getArea()
-Methode aufgerufen wird, berechnet sie die Fläche mithilfe der Formel im vorangegangenen Code, und der Code in der
RegularPolygon.getArea()
-Methode wird nie ausgeführt.
Im Gegensatz dazu definiert die EquilateralTriangle-Klasse keine eigene Version der
getPerimeter()
-Methode. Wenn die
EquilateralTriangle.getPerimeter()
-Methode aufgerufen wird, durchläuft der Aufruf die Vererbungskette aufwärts und führt den Code in der
getPerimeter()
-Methode der übergeordneten RegularPolygon-Klasse aus.
Der
EquilateralTriangle()
-Konstruktor verwendet die
super()
-Anweisung, um den
RegularPolygon()
-Konstruktor der übergeordneten Klasse explizit aufzurufen. Wenn beide Konstruktoren über den gleichen Parametersatz verfügen, können Sie den
EquilateralTriangle()
-Konstruktor weglassen. Stattdessen wird der
RegularPolygon()
-Konstruktor ausgeführt. Der
RegularPolygon()
-Konstruktor benötigt jedoch einen zusätzlichen Parameter,
numSides
. Somit ruft der
EquilateralTriangle()
-Konstruktor
super(len, 3)
auf, der den Eingabeparameter
len
und den Wert 3 übergibt. Auf diese Weise wird angegeben, dass das Dreieck drei Seiten hat.
Die
describe()
-Methode verwendet ebenfalls die
super()
-Anweisung, jedoch auf andere Weise. Sie ruft damit die Version der RegularPolygon-Superklasse der
describe()
-Methode auf. Die
EquilateralTriangle.describe()
-Methode stellt zuerst die String-Variable
desc
auf eine Anweisung zum Typ der Form ein. Dann ruft sie die Ergebnisse der
RegularPolygon.describe()
-Methode ab, indem sie
super.describe()
aufruft, und hängt das Ergebnis an den String
desc
an.
Die Square-Klasse wird hier nicht in allen Einzelheiten besprochen, aber sie ähnelt der EquilateralTriangle-Klasse. Sie stellt einen Konstruktor und ihre eigenen Implementationen der Methoden
getArea()
und
describe()
bereit.