V jednom z předchozích příspěvků jsme si představili velmi důležitý koncept objektově orientovaného programování: Třídy. Nyní si projdeme další klíčový koncept: Dědičnost, mechanismus, který umožňuje třídě přebírat chování jiné třídy.
Vzpomínáte si na příklad z předchozího příspěvku na blogu se třídou „Osoba“ ? Představme si školu a chceme spravovat studenty a učitele. Obě jsou osoby, ale s různými vlastnostmi. Vytvoříme tedy třídu „Učitel“ a třídu „Student“ a obě třídy zdědí vlastnosti od třídy „Osoba“.
Jak se dědí třída A od jiné třídy?
Nový Class extends K usnadnění dědění je nyní k dispozici klíčové slovo. Na našem školním příkladu vytvoříme třídu „Student“, která zdědí třídu „Osoba“.
Class Extends Person
A co konstruktor?
Pak se pro konstruktor (pokud jste pro třídu „Student“ nedefinovali konkrétní konstruktor) automaticky zavolá konstruktor třídy „Osoba“.
Můžete také přepsat konstruktor. Například v případě třídy „Student“: student má jméno, příjmení a datum narození jako osoba, ale student má také třídu a školu. V tomto případě můžete použít nový Super příkaz, který vám umožní zavolat konstruktor nadřazené třídy. V konstruktoru třídy „Student“ pak můžete přidat specifický kód pro třídu a školu.
Class constructor
.
C_TEXT( ) ( ) ( ) ( ) ( ) ( ; ; ) $1 // FirstName
C_TEXT$2 // LastName
C_DATE$3 // Birthdate
C_TEXT$4 // SchoolName
C_TEXT$5 // Grade
Super$1$2$3 // Call the "Person" constructor
ThisSchoolName:= $4
This . :=Grade$5
A funkce?
Můžete přidat funkce specifické pro třídu „Student“, ze které můžete volat funkci nadřazené třídy („Osoba“).
V následujícím příkladu máme funkci, která vrací řetězec obsahující jméno studenta, třídu a školu. Ve třídě „Osoba“ již máme funkci, která vrací celé jméno osoby. Zavoláme tedy tuto funkci, getFullName, a přidáme informace specifické pro studenta.
Function getIdentity
C_TEXT( ) := . ()+", "+ . +" známka v "+ .$0
$0SupergetFullNameThisGradeThisSchoolName
V metodě instancujeme instanci třídy „Student“. Funkci getFullName voláme z nadřazené třídy „Osoba“. Poté zavoláme funkci getIdentity ze třídy „Student“. Jak vidíte, mezi funkcemi getFullName a getIdentity nejsou žádné rozdíly.
C_OBJECT($s)
$s :=cs.Student.new("Joe"; "Doe";!2002-02-20!; "Waco High School"; "10th")
$name :=$s.getFullName() //return John Doe
$identity :=$s.getIdentity(
) //return Joe DOE, 10th grade in Waco High School