형태 유형별로 공통적인 메서드가 발견되면 각각의 형태 클래스를 정의할 수 있습니다. 구현해야 하는 메서드의 수를 기준으로 할 때 가장 간단한 형태는 다음에 나와 있듯이 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()
메서드에 대한 코드가 작성되어야 합니다. 또한 이 클래스에는
getCircumference()
라는 고유한 메서드가 정의되어 있습니다. Circle 클래스에는 다른 다각형 클래스에서는 찾을 수 없는
diameter
라는 속성도 선언되어 있습니다.
다른 두 유형의 형태, 즉 정사각형과 등변 삼각형은 몇 가지 추가적인 공통점이 있습니다. 예를 들어 두 형태 모두 변의 길이가 동일하며 일반적인 공식을 사용하여 둘레 및 내부 각도의 합을 계산할 수 있습니다. 사실 이러한 일반적인 공식은 앞으로 정의할 다른 모든 일반 다각형에도 적용됩니다.
RegularPolygon 클래스는 이후에 Square 클래스 및 EquilateralTriangle 클래스의 수퍼 클래스가 됩니다. 수퍼 클래스를 사용하면 한 곳에 공통적인 메서드를 정의할 수 있으므로 이러한 메서드를 각 하위 클래스에서 별도로 정의하지 않아도 됩니다. 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 클래스에서는 먼저 모든 일반 다각형에 공통적인 두 가지 속성, 즉
sideLength
속성(각 변의 길이) 및
numSides
속성(변의 수)을 선언합니다.
RegularPolygon 클래스에서는 IPolygon 인터페이스를 구현하며 이 인터페이스의 메서드 네 개를 모두 선언합니다. 이러한 메서드 중 두 개, 즉
getPerimeter()
및
getSumOfAngles()
메서드는 일반적인 공식을 사용하여 구현합니다.
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()
생성자에서는
super(len, 3)
을 호출하여
len
입력 매개 변수와 값 3을 전달함으로써 삼각형의 변이 3개임을 알립니다.
describe()
메서드에서도
super()
문을 사용하지만 다른 방법이 적용됩니다. 이 방법에서는 super() 문을 사용하여
describe()
메서드의 RegularPolygon 수퍼 클래스 버전을 호출합니다.
EquilateralTriangle.describe()
메서드에서는 먼저
desc
문자열 변수를 형태 유형에 대한 명령문으로 설정합니다. 그런 다음
super.describe()
를 호출하여
RegularPolygon.describe()
메서드의 결과를 구하고 이 결과를
desc
문자열에 추가합니다.
Square 클래스는 여기서 자세히 설명되지는 않지만 생성자와
getArea()
및
describe()
메서드의 자체 구현을 제공한다는 점에서 EquilateralTriangle 클래스와 유사합니다.