各種類のシェイプに共通するメソッドに関する考えがまとまったら、シェイプクラス自体を定義することができます。 実装する必要のあるメソッドの数で見た場合、最も単純なシェイプはここに示すように、Circle クラスです。
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;
}
}
}
Circle クラスは、IGeometricShape インターフェイスを実装するので、
getArea()
メソッドと
describe()
メソッドの両方に対するコードを提供する必要があります。さらに、Circle クラスに固有の
getCircumference()
メソッドを定義します。Circle クラスでは、他の多角形クラスでは見られない
diameter
プロパティの宣言もあります。
残りの 2 つの種類のシェイプの正方形および等辺三角形には、他の点で共通することがあります。つまり、等しい長さの辺を有する点で、両方について共通の式を使用して周辺と内角の総和を計算することができます。 実際、これらの共通の式はまた、今後定義するあらゆる正多角形に適用されます。
RegularPolygon クラスは、Square クラスと EquilateralTriangle クラスの両方のスーパークラスです。スーパークラスを使用すると、共通メソッドを 1 か所で定義できるので、サブクラスごとに別々に共通メソッドを定義する必要がありません。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;
}
}
}
最初に、RegularPolygon クラスは、すべての正多角形に共通する 2 つのプロパティを宣言します。つまり、各辺の長さの
sideLength
プロパティと辺の数の
numSides
プロパティです。
RegularPolygon クラスは、IPolygon インターフェイスを実装し、IPolygon インターフェイスメソッドを 4 つすべて宣言します。 そのうち
getPerimeter()
と
getSumOfAngles()
の 2 つのメソッドを共通の式を使用して実装します。
getArea()
メソッドの式はシェイプによって異なるので、基本クラスバージョンのメソッドは、サブクラスメソッドで継承可能な共通の論理を含むことができません。代わりに、面積を計算しなかったことを示すには、単にデフォルト値 0 を返します。各シェイプの面積を正しく計算するには、RegularPolygon クラスのサブクラスが
getArea()
メソッド自体をオーバーライドする必要があります。
EquilateralTriangle クラスの次のコードは、
getArea()
メソッドをオーバーライドする方法を示しています。
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;
}
}
}
override
キーワードは、
EquilateralTriangle.getArea()
メソッドが、RegularPolygon スーパークラスからの
getArea()
メソッドを意図的にオーバーライドすることを示します。
EquilateralTriangle.getArea()
メソッドが呼び出されると、前記のコードの式を使用して面積が計算されます。
RegularPolygon.getArea()
メソッドのコードが実行されることは決してありません。
対照的に、EquilateralTriangle クラスは独自のバージョンの
getPerimeter()
メソッドを定義しません。
EquilateralTriangle.getPerimeter()
メソッドが呼び出されると、継承チェーンに進み、RegularPolygon サブクラスの
getPerimeter()
メソッドのコードが実行されます。
EquilateralTriangle()
コンストラクターは
super()
ステートメントを使用して、そのスーパークラスの
RegularPolygon()
コンストラクターを明示的に呼び出します。両方のコンストラクターのパラメーターセットが同じ場合は、
EquilateralTriangle()
コンストラクターを完全に省略しておくこともできますが、代わりに
RegularPolygon()
コンストラクターが実行されます。ただし、
RegularPolygon()
コンストラクターは追加パラメーターの
numSides
を必要とします。したがって、
EquilateralTriangle()
コンストラクターは、三角形が 3 辺であることを示すために
len
入力パラメーターと値 3 を渡す
super(len, 3)
を呼び出します。
describe()
メソッドも
super()
ステートメントを使用しますが、方法が異なります。
describe()
メソッドの RegularPolygon スーパークラスのバージョンを呼び出します。
EquilateralTriangle.describe()
メソッドは、最初に
desc
ストリング変数をシェイプの種類に関する記述に設定します。次に、
super.describe()
を呼び出して
RegularPolygon.describe()
メソッドの結果を取得し、その結果を
desc
ストリングに追加します。
ここでは Square クラスについて詳細は説明しません。しかし、このクラスは、EquilateralTriangle クラスとよく似ていて、コンストラクターと
getArea()
および
describe()
メソッドの独自の実装を提供します。