Tworzenie hierarchii
Tworzenie hierarchii
Istnieje kilka sposobów zdefiniowania odpowiednich funkcji konstruktora do zaimplementowania hierarchii Pracownik. To w jaki sposób zdecydujesz się je zdefiniować zależy głównie od tego, co chcesz zrobić w swojej aplikacji.
Ten fragment pokazuje jak użyć prostych (i stosunkowo mało elastycznych) definicji w celu zademonstrowania dziedziczenia. W tych definicjach nie możesz określić żadnych wartości własności podczas tworzenia obiektu. Nowo utworzony obiekt po prostu otrzymuje wartości domyślne, które możesz zmienić później. Rysunek 8.2 ilustruje hierarchię wraz z tymi prostymi definicjami.
W prawdziwej aplikacji zdefiniowałbyś prawdopodobnie konstruktory, które pozwoliłyby Ci na zapewnienie własnościom wartości w czasie tworzenia obiektu (zobacz więcej elastycznych konstruktorów, aby uzyskać więcej informacji). Na chwilę obecną te proste definicje zademonstrują jak objawia się dziedziczenie.
Rysunek 8.2: Definicje obiektu Pracownik
Poniższe definicje obiektu Pracownik
w Javie i JavaScripcie są podobne. Różnią się one jedynie tym, że w Javie musisz określić typ każdej własności (w przeciwieństwie do JavaScriptu) oraz musisz stworzyć wyraźną metodę konstruktora dla klasy Javy.
</tr>
JavaScript | Java |
---|---|
function Pracownik () { this.imie = ""; this.dept = "ogólny"; } |
public class Pracownik { public String imie; public String dept; public Pracownik () { this.imie = ""; this.dept = "ogólny"; } } |
Definicje Manager
i Robotnik
pokazuję różnicę w sposobie określania następnego obiektu wyższego w łańcuchu dziedziczenia. W JavaScripcie dodajesz instancję prototypową jako wartość własności prototypu funkcji konstruktora. Możesz do zrobić w dowolnej chwili po zdefiniowaniu konstruktora. W Javie określasz superklasę wewnątrz definicji klasy. Nie możesz zmienić superklasy spoza definicji klasy.
</tr>
JavaScript | Java |
---|---|
function Manager () { this.raporty = []; } Manager.prototype = new Pracownik; function Robotnik () { this.projekty = []; } Robotnik.prototype = new Pracownik; |
public class Manager extends Pracownik { public Employee[] raporty; public Manager () { this.raporty = new Pracownik[0]; } } public class Robotnik extends Pracownik { public String[] projekty; public Robotnik () { this.projekty = new String[0]; } } |
Definicje Inzynier
i Sprzedawca
tworzą obiekty, które pochodzą od Robotnik
a stamtąd od Pracownik
. Obiekt tych typów posiada własności wszystkich obiektów znajdujących się ponad nim w łańcuchu. W dodatku definicje te nadpisują dziedziczoną własność dept
nowymi wartościami specyficznymi dla tych obiektów.
JavaScript | Java |
---|---|
function Sprzedawca () { this.dept = "sprzedaż"; this.przydzial = 100; } Sprzedawca.prototype = new Robotnik; function Inzynier () { this.dept = "inżynieria"; this.maszyna = ""; } Inzynier.prototype = new Robotnik; |
public class Sprzedawca extends Robotnik { public double przydzial; public Sprzedawca () { this.dept = "sprzedaż"; this.przydzial = 100.0; } } public class Inzynier extends Robotnik { public String maszyna; public Inzynier () { this.dept = "inżynieria"; this.maszyna = ""; } } |
Używając tych definicji możesz stworzyć instancje tych obiektów, których własności otrzymują domyślne wartości. Rysunek 8.3 ilustruje zastosowanie tych definicji JavaScriptu do zdefiniowania nowych obiektów i pokazuje wartości własności nowych obiektów.
Uwaga: Termin
instancja
posiada określone techniczne znaczenie w językach opartych na klasach. W językach tych instancja jest pojedynczą składową klasy i jest całkowicie różna od klasy. W JavaScripcie "instancja" nie ma takiego technicznego znaczenia, ponieważ JavaScript nie posiada tej różnicy między klasami a instancjami. Jednak, mówiąc o JavaScripcie, "instancja" może być użyta nieformalnie w znaczeniu obiektu utworzonego za pomocą konkretnej funkcji konstruktora. Dlatego w tym przykładzie mógłbyś nieformalnie stwierdzić, że janina
jest instancją Inzynier
. Podobnie chociaż terminy
rodzic, dziecko, przodek
i
potomek
nie mają formalnego znaczenia w JavaScripcie, możesz użyć ich nieformalnie, aby odnieść się do obiektów znajdujących się wyżej lub niżej w łańcuchu prototypu.
Rysunek 8.3: Tworzenie obiektów z prostymi definicjami