JavaRush /Blog Java /Random-MS /Hubungan antara kelas. Pewarisan, komposisi dan pengagreg...

Hubungan antara kelas. Pewarisan, komposisi dan pengagregatan

Diterbitkan dalam kumpulan
hello! Hari ini kita akan melihat dengan lebih dekat satu lagi prinsip pengaturcaraan berorientasikan objek (OOP) - warisan. Pada masa yang sama, kami akan mengkaji jenis hubungan lain antara kelas - komposisi dan pengagregatan. Topik ini tidak sukar: anda telah menemui warisan dan contoh-contohnya berkali-kali dalam kuliah sebelumnya. Hari ini perkara utama adalah untuk menyatukan pengetahuan anda, lihat dengan lebih dekat mekanisme pewarisan dan sekali lagi lihat contoh :) Jadi, mari pergi!
Hubungan antara kelas.  Warisan, gubahan dan pengagregatan - 1

Warisan di Jawa dan faedahnya

Seperti yang anda mungkin ingat, warisan ialah mekanisme yang membolehkan anda menerangkan kelas baharu berdasarkan kelas (ibu bapa) sedia ada. Dalam kes ini, sifat dan kefungsian kelas induk dipinjam oleh kelas baharu. Mari kita ingat contoh pewarisan dari kuliah terdahulu:
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);
   }
}
Terdapat program tertentu di mana kami bekerja dengan pelbagai jenis kereta. Walaupun anda bukan peminat kereta, anda mungkin tahu bahawa terdapat banyak jenis kereta yang sama ini di dunia :) Oleh itu, kami memisahkan sifat umum kereta kepada kelas induk biasa - Car. Apakah persamaan semua kereta, tanpa mengira jenisnya? Mana-mana kereta mempunyai tahun pembuatan, nama model dan kelajuan maksimum. Kami meletakkan sifat ini ke dalam medan model, maxSpeed, yearOfManufacture. Bagi tingkah laku, mana-mana kereta boleh memecut dan brek :) Kami mentakrifkan tingkah laku ini dalam kaedah gas()dan brake(). Apakah faedah yang diberikan ini kepada kita? Pertama sekali, mengurangkan jumlah kod. Sudah tentu, kita boleh melakukannya tanpa kelas induk. Tetapi oleh kerana setiap kereta mesti boleh memecut dan brek, kita perlu mencipta kaedah gas()dalam brake()kelas Truck, dalam kelas Sedan, dalam kelas F1Car, dalam kelas Sportcardan dalam semua kelas kereta yang lain. Bayangkan berapa banyak kod tambahan yang akan kami tulis dalam kes ini. Jangan lupa tentang medan model, maxSpeed ​​​​dan yearOfManufacture: jika kami meninggalkan kelas induk, kami akan menciptanya dalam setiap kelas mesin! Hubungan antara kelas.  Pewarisan, gubahan dan pengagregatan - 2 Apabila kita mempunyai beberapa dozen kelas mesin, jumlah kod berulang akan menjadi sangat serius. Memindahkan medan dan kaedah biasa (juga dipanggil "keadaan" dan "kelakuan") ke dalam kelas induk akan membolehkan kami menjimatkan banyak masa dan ruang. Jika jenis tertentu mempunyai sifat atau kaedah yang unik hanya untuknya dan tiada daripada jenis mesin lain, ia tidak mengapa. Mereka sentiasa boleh dicipta dalam kelas keturunan, berasingan daripada semua yang lain.
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();
   }
}
Ambil contoh kereta lumba Formula 1. Mereka, tidak seperti "saudara-mara" mereka, mempunyai tingkah laku yang unik - dari semasa ke semasa mereka membuat perhentian. Ini tidak mengganggu kita. Kami telah menerangkan tingkah laku umum dalam kelas induk Cardan kami boleh menambah gelagat khusus kelas kanak-kanak di dalam kelas. Hubungan antara kelas.  Pewarisan, gubahan dan pengagregatan - 3 Ini juga terpakai pada medan: jika kelas kanak-kanak mempunyai sifat unik, kami boleh mengisytiharkan medan ini dengan tenang di dalamnya dan tidak bimbang :) Keupayaan untuk menggunakan semula kod ialah kelebihan utama warisan. Adalah sangat penting bagi seorang pengaturcara untuk tidak menulis jumlah kod yang tidak diperlukan. Anda akan menghadapi ini lebih daripada sekali dalam kerja anda. Sila ingat satu lagi perkara yang sangat penting: tiada warisan berbilang di Jawa. Setiap kelas mewarisi daripada satu kelas sahaja. Kami akan bercakap tentang sebab untuk ini dengan lebih terperinci dalam kuliah akan datang, tetapi buat masa ini ingat sahaja. Ini, dengan cara ini, membezakan Java daripada beberapa bahasa OOP lain. Sebagai contoh, C++ mempunyai pelbagai warisan. Segala-galanya lebih kurang jelas dengan warisan - mari kita teruskan.

Komposisi dan Pengagregatan

Kelas dan objek boleh dikaitkan antara satu sama lain. Warisan menerangkan hubungan "is" (atau dalam bahasa Inggeris "IS A"). Leo ialah Haiwan. Hubungan ini boleh dinyatakan dengan mudah menggunakan warisan, di mana Animalkelas akan menjadi ibu bapa dan Lionkelas akan menjadi anak. Walau bagaimanapun, tidak semua hubungan di dunia digambarkan dengan cara ini. Sebagai contoh, papan kekunci pasti disambungkan ke komputer dalam beberapa cara, tetapi ia bukan komputer . Tangan entah bagaimana berhubung dengan orang itu, tetapi mereka bukan orang itu. Dalam kes ini, ia adalah berdasarkan jenis hubungan yang berbeza: bukan "adalah", tetapi "adalah sebahagian" ("HAS A"). Tangan bukan orang, tetapi ia adalah sebahagian daripada seseorang. Papan kekunci bukan komputer, tetapi ia adalah sebahagian daripada komputer. Perhubungan HAS A boleh diterangkan dalam kod menggunakan mekanisme gubahan dan pengagregatan . Perbezaan di antara mereka terletak pada "ketakutan" sambungan ini. Mari kita berikan contoh mudah: Kita ada milik kita Car- sebuah kereta. Setiap kereta ada enjin. Di samping itu, setiap kereta mempunyai penumpang di dalam. Apakah perbezaan asas antara bidang Engine enginedan Passenger [] passengers? Jika kereta mempunyai penumpang di dalam А, ini tidak bermakna tidak boleh ada penumpang di Bdalamnya C. Satu kereta boleh memuatkan beberapa penumpang. Di samping itu, jika semua penumpang dikeluarkan dari kereta, ia akan terus berfungsi dengan senyap. Hubungan antara kelas Cardan jisim penumpang Passenger [] passengerskurang ketat. Ia dipanggil pengagregatan . Terdapat artikel yang bagus tentang topik ini: Hubungan antara kelas (objek) . Ia memberikan satu lagi contoh pengagregatan yang baik. Katakan kita mempunyai kelas Studentyang menunjukkan pelajar, dan kelas StudentsGroup(sekumpulan pelajar). Seorang pelajar boleh menjadi ahli kelab fizik, kelab peminat pelajar Star Wars atau pasukan KVN. Komposisi adalah jenis komunikasi yang lebih ketat. Apabila menggunakan gubahan, objek bukan sahaja sebahagian daripada beberapa objek, tetapi juga tidak boleh dimiliki oleh objek lain daripada jenis yang sama. Contoh paling mudah ialah enjin kereta. Enjin adalah sebahagian daripada kereta, tetapi tidak boleh menjadi sebahagian daripada kereta lain. Seperti yang anda lihat, hubungan mereka adalah lebih ketat daripada Cardan Passengers. Hubungan antara kelas.  Pewarisan, gubahan dan pengagregatan - 4
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION