Zodra u een goed idee hebt van de methoden die op elk vormtype van toepassing zijn, kunt u de klassen Shape zelf definiëren. Als u wilt weten hoeveel methoden u moet implementeren, kunt u dit baseren op de eenvoudigste vorm; de klasse Circle, zoals hieronder getoond:
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;
}
}
}
De klasse Circle implementeert de interface IGeometricShape, daarom moet deze code bieden voor zowel de methode
getArea()
als de methode
describe()
. Bovendien definieert deze de methode
getCircumference()
, uniek voor de klasse Circle. De klasse Circle declareert ook een eigenschap,
diameter
, die niet in de andere veelhoekklassen voorkomt.
De andere twee typen vormen, vierkanten en gelijkzijdige driehoeken, hebben enkele andere zaken gemeen: ze hebben allebei zijden van gelijke lengte en er zijn formules die u voor beide kunt gebruiken om de omtrek en de som van de binnenhoeken te berekenen. In feite zijn deze algemene formules van toepassing op alle normale veelhoeken die u in de toekomst zult definiëren.
De klasse RegularPolygon wordt de superklasse voor de klasse Square en de klasse EquilateralTriangle. Met een superklasse kunt u algemene methoden op één plaats definiëren, zodat u ze niet afzonderlijk in elke subklasse hoeft te definiëren. Hier is de code voor de klasse RegularPolygon:
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;
}
}
}
Eerst declareert de klasse RegularPolygon twee eigenschappen die gemeenschappelijk zijn voor alle regelmatige veelhoeken: de lengte van elke zijde (de eigenschap
sideLength
) en het aantal zijden (de eigenschap
numSides
).
De klasse RegularPolygon implementeert de interface IPolygon en declareert alle vier de interfacemethoden van IPolygon. Twee van de methoden (de methoden
getPerimeter()
en
getSumOfAngles()
) worden met algemene formules geïmplementeerd.
Omdat de formule voor de methode
getArea()
verschilt van vorm tot vorm, kan de basisklassenversie van de methode niet de algemene logica opnemen die kan worden overgeërfd door de methoden van de subklassen. In plaats hiervan wordt de standaardwaarde 0 geretourneerd om aan te geven dat het gebied niet is berekend. Als u het gebied van elke vorm correct wilt berekenen, moeten de subklassen van de klasse RegularPolygon de methode
getArea()
zelf overschrijven.
De volgende code voor de klasse EquilateralTriangle toont hoe de methode
getArea()
is overschreven:
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;
}
}
}
Het trefwoord
override
geeft aan dat de methode
EquilateralTriangle.getArea()
met opzet de methode
getArea()
van de superklasse RegularPolygon overschrijft. Wanneer de methode
EquilateralTriangle.getArea()
wordt aangeroepen, berekent deze het gebied met gebruik van de formule in de vorige code en wordt de code in de methode
RegularPolygon.getArea()
nooit uitgevoerd.
De klasse EquilateralTriangle daarentegen definieert zijn eigen versie van de methode
getPerimeter()
niet. Wanneer de methode
EquilateralTriangle.getPerimeter()
wordt aangeroepen, doorloopt de aanroep de overervingsketen naar boven en voert de code in de methode
getPerimeter()
van de superklasse RegularPolygon uit.
De constructor
EquilateralTriangle()
gebruikt de instructie
super()
om expliciet de constructor
RegularPolygon()
van de superklasse aan te roepen. Als beide constructors dezelfde set parameters hebben, kunt u de constructor
EquilateralTriangle()
weglaten en zou de constructor
RegularPolygon()
worden uitgevoerd. De constructor
RegularPolygon()
heeft echter een extra parameter
numSides
nodig. De constructor
EquilateralTriangle()
roept dus
super(len, 3)
aan, die de invoerparameter
len
en de waarde 3 doorloopt om aan te geven dat de driehoek drie zijden heeft.
De methode
describe()
gebruikt ook de instructie
super()
, maar op een andere manier. Deze gebruikt deze instructie voor het aanroepen van de versie van de superklasse RegularPolygon van de methode
describe()
. De methode
EquilateralTriangle.describe()
stelt eerst de tekenreeksvariabele
desc
in op een instructie over het vormtype. Vervolgens haalt de methode het resultaat van de methode
RegularPolygon.describe()
op door
super.describe()
aan te roepen; het resultaat wordt vervolgens toegevoegd aan de tekenreeks
desc
.
De klasse Square wordt hier niet uitgebreid besproken, maar is vergelijkbaar met de klasse EquilateralTriangle, die een constructor en eigen implementaties van de methoden
getArea()
en
describe()
biedt.