Tüm şekil türleri için ortak olan yöntemler hakkında iyice fikir edindikten sonra, şekil sınıflarını tanımlayabilirsiniz. Uygulamanız gereken yöntem sayısı açısından en basit şekil, burada gösterildiği gibi Circle sınıfıdır:
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 sınıfı, IGeometricShape arabirimini uygular, bu nedenle hem
getArea()
yöntemi hem de
describe()
yöntemi için kod sağlamalıdır. Ayrıca, Circle sınıfı için benzersiz olan
getCircumference()
yöntemini tanımlar. Circle sınıfı da diğer çokgen sınıflarında bulunmayan bir özellik olarak
diameter
özelliğini bildirir.
Diğer iki şekil türü olan kareler ve eşkenar üçgenler, ortak başka şeylere sahiptir: bunların her biri eşit uzunlukta kenarlara sahiptir ve her ikisi için de çevre uzunluğunu ve iç açıları toplamını hesaplamakta kullanabileceğiniz ortak formüller vardır. Aslında bu ortak formüller, gelecekte de tanımlayacağınız diğer normal çokgenler için de geçerlidir.
RegularPolygon sınıfı hem Square sınıfı hem de EquilateralTriangle sınıfı için üst sınıftır. Üst sınıf, ortak yöntemleri tek bir yerde tanımlamanıza olanak sağlar, böylece alt sınıfların her birinde bunları ayrı ayrı tanımlamanız gerekmez. RegularPolygon sınıfının kodu şöyledir:
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;
}
}
}
İlk olarak, RegularPolygon sınıfı, tüm normal çokgenler için ortak olan iki özelliği bildirir: kenarların her birinin uzunluğu (
sideLength
özelliği) ve kenar sayısı (
numSides
özelliği).
RegularPolygon sınıfı IPolygon arabirimini uygular ve IPolygon arabirim yöntemleri için dört yöntemi de bildirir. Ortak formülleri kullanarak bunlardan ikisini (
getPerimeter()
ve
getSumOfAngles()
yöntemleri) uygular.
getArea()
yönteminin formülü şekilden şekle göre değiştiği için, yöntemin temel sınıf sürümü, alt sınıf yöntemleri tarafından miras alınabilen ortak mantığı içeremez. Bunun yerine, alanın hesaplanmadığını belirtmek için 0 varsayılan değerini döndürür. Her şeklin alanını doğru şekilde hesaplamak için, RegularPolygon sınıfının alt sınıfları,
getArea()
yöntemini geçersiz kılmalıdır.
Aşağıdaki EquilateralTriangle sınıfının kodu,
getArea()
yönteminin nasıl geçersiz kılındığını gösterir:
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
anahtar sözcüğü,
EquilateralTriangle.getArea()
yönteminin RegularPolygon üst sınıfından
getArea()
yöntemini kasıtlı olarak geçersiz kıldığını belirtir.
EquilateralTriangle.getArea()
yöntemi çağrıldığında, önceki kodda bulunan formülü kullanarak alanı hesaplar ve
RegularPolygon.getArea()
yöntemindeki kod asla çalıştırılmaz.
Buna karşılık, EquilateralTriangle sınıfı, kendi
getPerimeter()
yöntemi sürümünü tanımlamaz.
EquilateralTriangle.getPerimeter()
yöntemi çağrıldığında, çağrı miras zincirinde yukarı gider ve RegularPolygon üst sınıfının
getPerimeter()
yönteminde kodu çalıştırır.
EquilateralTriangle()
yapıcısı, üst sınıfının
RegularPolygon()
yapıcısını açıkça çağırmak için
super()
deyimini kullanır. Her iki yapıcı da aynı parametre kümesine sahip olsaydı,
EquilateralTriangle()
yapıcısı tamamen çıkarılabilir ve bunun yerine
RegularPolygon()
yapıcısı çalıştırılabilirdi. Ancak,
RegularPolygon()
yapıcısı
numSides
adında fazladan bir parametre gerektirir. Bu nedenle
EquilateralTriangle()
yapıcısı, üçgenin kenarının olduğunu belirtmek için
len
girdi parametresi ve 3 değeriyle birlikte iletilen
super(len, 3)
öğesini çağırır.
describe()
yöntemi ayrıca
super()
deyimini farklı bir şekilde kullanır.
describe()
yönteminin RegularPolygon üst sınıf sürümünü çağırmak için kullanır.
EquilateralTriangle.describe()
yöntemi ilk olarak
desc
dize değişkenini şeklin türüyle ilgili bir deyime ayarlar. Daha sonra
super.describe()
öğesini çağırarak
RegularPolygon.describe()
yönteminin sonuçlarını alır ve bu sonuçları
desc
dizesine ekler.
Square sınıfı burada ayrıntılı şekilde ele alınmamıştır ancak bu sınıf, EquilateralTriangle sınıfına çok benzeyip bir yapıcı ve
getArea()
ve
describe()
yöntemlerinin kendi uygulamalarını sağlar.