JavaRush /Java blogi /Random-UZ /Sinflar o'rtasidagi munosabatlar. Meros, tarkib va yig'il...

Sinflar o'rtasidagi munosabatlar. Meros, tarkib va yig'ilish

Guruhda nashr etilgan
Salom! Bugun biz ob'ektga yo'naltirilgan dasturlashning (OOP) yana bir printsipi - merosni batafsil ko'rib chiqamiz. Shu bilan birga, biz sinflar o'rtasidagi munosabatlarning boshqa turlarini - tarkib va ​​yig'ilishni o'rganamiz. Bu mavzu qiyin bo'lmaydi: siz oldingi ma'ruzalarda meros va uning misollariga ko'p marta duch kelgansiz. Bugun asosiy narsa bilimlaringizni mustahkamlash, meros mexanizmini batafsil ko'rib chiqish va yana bir bor misollarni ko'rib chiqish bo'ladi :) Shunday qilib, ketaylik!
Sinflar o'rtasidagi munosabatlar.  Meros, tarkib va ​​jamlanish - 1

Java-da meros va uning afzalliklari

Esingizda bo'lsa kerak, meros - bu mavjud (ota-ona) asosida yangi sinfni tavsiflash imkonini beruvchi mexanizm. Bunday holda, ota-klassning xususiyatlari va funksionalligi yangi sinf tomonidan qarzga olinadi. Oldingi ma'ruzalardagi meros misolini eslaylik:
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);
   }
}
Ma'lum bir dastur mavjud bo'lib, uning doirasida biz har xil turdagi avtomobillar bilan ishlaymiz. Agar siz avtoulov ishqibozi bo'lmasangiz ham, dunyoda bir xil mashinalarning juda ko'p turlari mavjudligini bilasiz :) Shuning uchun biz avtomobillarning umumiy xususiyatlarini umumiy ota-onalar sinfiga ajratamiz - Car. Turidan qat'i nazar, barcha mashinalarda qanday umumiylik bor? Har qanday mashina ishlab chiqarilgan yili, model nomi va maksimal tezligiga ega. modelBu xususiyatlarni , maxSpeed, maydonlariga joylashtiramiz yearOfManufacture. Xulq-atvorga kelsak, har qanday mashina tezlashishi va tormozlanishi mumkin :) Biz bu xatti-harakatni usullarda gas()va brake(). Bu bizga qanday foyda keltiradi? Avvalo, kod miqdorini kamaytirish. Albatta, biz ota-ona sinfisiz ham qila olamiz. Ammo har bir mashina tezlashishi va tormozlanishi kerak bo'lganligi sababli, biz gas()sinfda brake(), Trucksinfda Sedan, sinfda F1Car, sinfda Sportcarva boshqa barcha sinfdagi avtomobillarda usullarni yaratishimiz kerak bo'ladi. Bu holatda qancha qo'shimcha kod yozishimizni tasavvur qiling. Model, maxSpeed ​​​​va yearOfManufacture maydonlari haqida unutmang: agar biz ota-klassdan voz kechsak, ularni har bir mashina sinfida yaratamiz! Sinflar o'rtasidagi munosabatlar.  Meros, tarkib va ​​yig'ilish - 2 Bizda bir necha o'nlab mashina sinflari mavjud bo'lganda, takrorlanadigan kod miqdori haqiqatan ham jiddiy bo'ladi. Umumiy maydonlar va usullarni (shuningdek, "holat" va "xulq-atvor" deb ataladi) ota-klassga ko'chirish bizga ko'p vaqt va joyni tejash imkonini beradi. Agar ma'lum bir turdagi faqat o'ziga xos bo'lgan va boshqa turdagi mashinalarda mavjud bo'lmagan xususiyatlar yoki usullar mavjud bo'lsa, bu muhim emas. Ular har doim avlod sinfida, boshqalardan alohida yaratilishi mumkin.
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 poyga avtomobillari misolini olaylik. Ular, o'zlarining "qarindoshlaridan" farqli o'laroq, o'ziga xos xulq-atvorga ega - vaqti-vaqti bilan pit-stop uchun to'xtashadi. Bu bizni bezovta qilmaydi. Biz allaqachon ota-onalar sinfidagi umumiy xatti-harakatlarni tasvirlab berdik Carva biz avlod sinflarining o'ziga xos xatti-harakatlarini sinflar ichiga qo'shishimiz mumkin. Sinflar o'rtasidagi munosabatlar.  Meros, tarkib va ​​yig'ilish - 3 Bu maydonlar uchun ham amal qiladi: agar bolalar sinfi o'ziga xos xususiyatlarga ega bo'lsa, biz uning ichida bu maydonlarni xotirjamlik bilan e'lon qilishimiz va xavotirlanmasligimiz mumkin :) Kodni qayta ishlatish qobiliyati - merosning asosiy afzalligi. Dasturchi uchun keraksiz miqdorda kod yozmaslik juda muhimdir. Siz buni ishingizda bir necha marta uchratasiz. Iltimos, yana bir muhim narsani esda tuting: Java-da bir nechta meros yo'q. Har bir sinf faqat bitta sinfdan meros oladi. Buning sabablari haqida keyingi ma'ruzalarda batafsilroq gaplashamiz, ammo hozircha esda tuting. Aytgancha, bu Java-ni boshqa OOP tillaridan ajratib turadi. Masalan, C++ bir nechta merosga ega. Meros bilan hamma narsa ko'proq yoki kamroq aniq - keling, davom etamiz.

Tarkibi va yig'ilishi

Sinflar va ob'ektlar bir-biri bilan bog'lanishi mumkin. Meros "bo'ladi" (yoki ingliz tilida "IS A") munosabatini tavsiflaydi. Leo - Hayvon. Bu munosabatni meros orqali osongina ifodalash mumkin, bunda Animalsinf ota-ona, Lionsinf esa bola bo'ladi. Biroq, dunyodagi barcha munosabatlar bu tarzda tasvirlangan emas. Misol uchun, klaviatura, albatta, qandaydir tarzda kompyuterga ulangan, lekin u kompyuter emas . Qo'llar qandaydir tarzda odam bilan bog'langan, ammo ular odam emas. Bunday hollarda, u boshqa turdagi munosabatlarga asoslanadi: "bo'ladi" emas, balki "bir qismi" ("HAS A"). Qo'l odam emas, lekin u insonning bir qismidir. Klaviatura kompyuter emas, lekin u kompyuterning bir qismidir. HAS A munosabatlari kompozitsiya va yig'ish mexanizmlari yordamida kodda tasvirlanishi mumkin . Ularning orasidagi farq bu aloqalarning "qat'iyligi" dadir. Oddiy misol keltiraylik: Bizniki Car- mashinamiz bor. Har bir mashinaning dvigateli bor. Bundan tashqari, har bir mashinaning ichida yo'lovchilar bor. Engine engineMaydonlar va o'rtasidagi asosiy farq nima Passenger [] passengers? Agar mashina ichida yo'lovchi bo'lsa , bu uning Аichida yo'lovchilar bo'lishi mumkin emas degani emas . Bir mashina bir nechta yo'lovchini sig'dira oladi. Bundan tashqari, agar barcha yo'lovchilar mashinadan olib tashlansa, u jimgina ishlashda davom etadi. Sinf va yo'lovchilar massasi o'rtasidagi munosabatlar unchalik qat'iy emas. U agregatsiya deb ataladi . Ushbu mavzu bo'yicha yaxshi maqola bor: Sinflar (ob'ektlar) o'rtasidagi munosabatlar . Bu yig'ishning yana bir yaxshi namunasini beradi. Aytaylik, bizda talabani bildiruvchi sinf va sinf (talabalar guruhi) bor. Talaba fizika to'garagi, "Yulduzli urushlar" talabalar fan-klubi yoki KVN jamoasi a'zosi bo'lishi mumkin. Kompozitsiya aloqaning yanada qattiq turidir. Kompozitsiyadan foydalanilganda, ob'ekt nafaqat biron bir ob'ektning bir qismi, balki bir xil turdagi boshqa ob'ektga ham tegishli bo'lishi mumkin emas. Eng oddiy misol - avtomobil dvigateli. Dvigatel avtomobilning bir qismidir, lekin boshqa avtomobilning bir qismi bo'lishi mumkin emas. Ko'rib turganingizdek, ularning aloqasi va ga qaraganda ancha qattiqroq . BCCarPassenger [] passengersStudentStudentsGroupCarPassengersSinflar o'rtasidagi munosabatlar.  Meros, tarkib va ​​yig'ilish - 4
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION