Salam! Bu gün biz obyekt yönümlü proqramlaşdırmanın (OOP) başqa bir prinsipi - mirasla daha yaxından tanış olacağıq. Eyni zamanda, biz siniflər arasında münasibətlərin digər növlərini - kompozisiya və aqreqasiyanı öyrənəcəyik. Bu mövzu çətin olmayacaq: siz artıq əvvəlki mühazirələrdə miras və onun nümunələri ilə dəfələrlə qarşılaşmısınız. Bu gün əsas şey biliklərinizi möhkəmləndirmək, varislik mexanizminə daha yaxından baxmaq və bir daha nümunələri nəzərdən keçirmək olacaq :) Beləliklə, gedək!
Java-da miras və onun üstünlükləri
Yəqin ki, xatırladığınız kimi, varislik mövcud (ana) sinfə əsaslanaraq yeni bir sinfi təsvir etməyə imkan verən mexanizmdir. Bu halda ana sinifin xassələri və funksionallığı yeni sinif tərəfindən götürülür. Əvvəlki mühazirələrdən miras nümunəsini xatırlayaq:public class Car {
private String model;
private int maxSpeed;
private int yearOfManufacture;
public Car(String model, int maxSpeed, int yearOfManufacture) {
this.model = model;
this.maxSpeed = maxSpeed;
this.yearOfManufacture = yearOfManufacture;
}
public void gas() {
//...gas
}
public void brake() {
//...brake
}
}
public class Truck extends Car {
public Truck(String model, int maxSpeed, int yearOfManufacture) {
super(model, maxSpeed, yearOfManufacture);
}
}
public class Sedan extends Car {
public Sedan(String model, int maxSpeed, int yearOfManufacture) {
super(model, maxSpeed, yearOfManufacture);
}
}
Müəyyən bir proqram var ki, onun çərçivəsində müxtəlif növ avtomobillərlə işləyirik. Avtomobil həvəskarı olmasanız belə, yəqin ki, dünyada bu eyni avtomobillərin çoxlu növlərinin olduğunu bilirsiniz :) Buna görə də biz avtomobillərin ümumi xüsusiyyətlərini ümumi ana sinifə ayırırıq - Car
. Növündən asılı olmayaraq bütün avtomobillərin ortaq cəhəti nədir? İstənilən avtomobilin istehsal ili, model adı və maksimum sürəti var. model
Bu xassələri , maxSpeed
, sahələrinə qoyuruq yearOfManufacture
. Davranışa gəlincə, istənilən avtomobil sürətləndirə və əyləc edə bilər :) Biz bu davranışı metodlarda gas()
və brake()
. Bunun bizə hansı faydaları var? İlk növbədə, kodun miqdarının azaldılması. Əlbəttə ki, valideyn sinfi olmadan da edə bilərik. Ancaq hər bir avtomobil sürətləndirməyi və əyləc etməyi bacarmalı olduğundan, biz sinifdə gas()
, sinifdə , sinifdə , sinifdə və bütün digər avtomobil siniflərində üsullar yaratmalı olacağıq . Təsəvvür edin, bu halda nə qədər əlavə kod yazacağıq. Model, maxSpeed və yearOfManufacture sahələri haqqında unutmayın: əgər ana sinifdən imtina etsək, onları maşın siniflərinin hər birində yaradacağıq! Bir neçə onlarla maşın sinifimiz olduqda, təkrarlanan kodun miqdarı həqiqətən ciddi olacaq. Ümumi sahələr və metodların (“vəziyyət” və “davranış” da deyilir) ana sinifə köçürülməsi bizə çox vaxt və məkana qənaət etməyə imkan verəcək. Müəyyən bir növün yalnız özünəməxsus xüsusiyyətləri və ya metodları varsa və digər növ maşınlarda yoxdursa, bunun əhəmiyyəti yoxdur. Onlar həmişə digərlərindən ayrı olaraq nəsil sinfində yaradıla bilərlər. brake()
Truck
Sedan
F1Car
Sportcar
public class F1Car extends Car {
public void pitStop() {
//...only racing cars make pit stops
}
public static void main(String[] args) {
F1Car formula1Car = new F1Car();
formula1Car.gas();
formula1Car.pitStop();
formula1Car.brake();
}
}
Formula 1 yarış avtomobillərini götürək. Onlar, "qohumlarından" fərqli olaraq, özünəməxsus bir davranışa sahibdirlər - vaxtaşırı pit-stop üçün dayanırlar. Bu bizi narahat etmir. Biz artıq ana sinifdə ümumi davranışı təsvir etmişik Car
və nəsil siniflərin xüsusi davranışını siniflər daxilində əlavə edə bilərik. Bu, sahələrə də aiddir: əgər uşaq sinfi unikal xüsusiyyətlərə malikdirsə, biz onun daxilində bu sahələri sakitcə elan edə bilərik və narahat olmayaq :) Koddan təkrar istifadə etmək imkanı varisliyin əsas üstünlüyüdür. Proqramçının lazımsız miqdarda kod yazmaması çox vacibdir. İşinizdə bununla bir dəfədən çox qarşılaşacaqsınız. Xahiş edirəm daha bir vacib şeyi xatırlayın: Java-da çoxlu miras yoxdur. Hər bir sinif yalnız bir sinifdən miras alır. Bunun səbəbləri haqqında gələcək mühazirələrdə daha ətraflı danışacağıq, amma hələlik xatırlayın. Bu, yeri gəlmişkən, Java-nı bəzi digər OOP dillərindən fərqləndirir. Məsələn, C++ çoxlu mirasa malikdir. Mirasla hər şey az-çox aydındır - davam edək.
Tərkibi və Toplama
Siniflər və obyektlər bir-biri ilə əlaqəli ola bilər. Varislik "is" (və ya ingilis dilində "IS A") münasibətini təsvir edir. Şir Heyvandır. Bu əlaqə mirasdan istifadə etməklə asanlıqla ifadə edilə bilər, buradaAnimal
sinif valideyn, Lion
sinif isə uşaq olacaqdır. Ancaq dünyadakı bütün münasibətlər bu şəkildə təsvir olunmur. Məsələn, bir klaviatura mütləq bir şəkildə kompüterə bağlıdır, lakin o, kompüter deyil . Əllər bir növ insanla bağlıdır, amma insan deyil. Bu hallarda, o, fərqli münasibət növünə əsaslanır: “olur” deyil, “hissəsidir” (“HAS A”). Əl insan deyil, insanın bir hissəsidir. Klaviatura kompüter deyil, kompüterin bir hissəsidir. HAS A əlaqələri kompozisiya və toplama mexanizmlərindən istifadə edərək kodda təsvir edilə bilər . Aralarındakı fərq bu əlaqələrin “sərtliyində”dir. Sadə bir misal verək: Bizim Car
maşınımız var. Hər bir avtomobilin mühərriki var. Bundan əlavə, hər bir avtomobilin içərisində sərnişinlər var. Engine engine
Sahələr və sahələr arasındakı əsas fərq nədir Passenger [] passengers
? Əgər avtomobilin içərisində sərnişin varsa , bu o demək deyil ki, onun А
içində sərnişin ola bilməz . Bir avtomobil bir neçə sərnişini qəbul edə bilər. Bundan əlavə, bütün sərnişinlər avtomobildən çıxarılarsa, o, sakit şəkildə işləməyə davam edəcək. Sinif və sərnişin kütləsi arasındakı əlaqə daha az sərtdir. Buna aqreqasiya deyilir . Bu mövzuda yaxşı bir məqalə var: Siniflər (obyektlər) arasında əlaqələr . Bu birləşmənin başqa bir yaxşı nümunəsini təqdim edir. Tutaq ki, bizdə şagirdi bildirən bir sinif və bir sinif (bir qrup tələbə) var. Tələbə fizika klubunun, Star Wars tələbə fan klubunun və ya KVN komandasının üzvü ola bilər. Kompozisiya daha sərt ünsiyyət növüdür. Kompozisiyadan istifadə edərkən obyekt nəinki hansısa obyektin bir hissəsidir, həm də eyni tipli başqa bir obyektə aid ola bilməz. Ən sadə nümunə avtomobil mühərrikidir. Mühərrik avtomobilin bir hissəsidir, lakin başqa bir avtomobilin bir hissəsi ola bilməz. Gördüyünüz kimi, onların əlaqəsi və ilə müqayisədə daha sərtdir . B
C
Car
Passenger [] passengers
Student
StudentsGroup
Car
Passengers
GO TO FULL VERSION