JavaRush /Blog Java /Random-MS /Kaedah lalai dalam antara muka

Kaedah lalai dalam antara muka

Diterbitkan dalam kumpulan
Setiap versi Java baharu berbeza daripada versi sebelumnya. Berikut ialah contoh perubahan daripada bahan yang kami bincangkan: Sebelum Java 5, tiada enum's dalam bahasa.
Kaedah lalai dalam antara muka - 1
Begitu juga, Java 8 nyata berbeza daripada Java 7. Kebanyakan kuliah kami ditulis dalam versi ke-7 bahasa, tetapi, sudah tentu, kami tidak akan mengabaikan inovasi penting. Memandangkan kita bercakap tentang antara muka dalam kuliah ini, mari lihat satu kemas kini - kaedah lalai dalam antara muka . Anda sudah tahu bahawa antara muka tidak melaksanakan . Tugasnya adalah untuk menerangkan tingkah laku yang sepatutnya dimiliki oleh semua objek yang melaksanakannya . Tetapi selalunya pembangun menghadapi situasi di mana pelaksanaan kaedah dalam semua kelas adalah sama. Mari lihat contoh kereta lama kami:
public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}
Pada pendapat anda, apakah masalah utama dengan kod ini? Anda mungkin perasan bahawa kami menulis sekumpulan kod yang sama! Masalah ini adalah perkara biasa dalam pengaturcaraan dan harus dielakkan. Perkara lain ialah sebelum keluaran Java 8 tidak ada pilihan penyelesaian khas. Apabila versi ini keluar, ia menjadi mungkin untuk menentukan kaedah lalai dan melaksanakannya terus di dalam antara muka! Begini caranya:
public interface Car {

   public default void gas() {
       System.out.println("Газ!");
   }

   public default void brake() {
       System.out.println("Тормоз!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
Kini kaedah gas()dan brake(), yang sama untuk semua mesin, disertakan dalam antara muka, dan kod pendua tidak diperlukan. Lebih-lebih lagi, kaedah tersedia dalam setiap kelas!
public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
Bagaimana jika terdapat 100 kelas dengan kaedah gas(), tetapi hanya 99 daripadanya mempunyai tingkah laku yang sama? Ini merosakkan segala-galanya, dan kaedah lalai tidak akan berfungsi dalam kes ini? Sudah tentu tidak :) Kaedah lalai antara muka boleh ditindih.
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
Semua 99 jenis mesin yang lain akan melaksanakan kaedah lalai, dan kelas UnusualCar- pengecualian - tidak akan merosakkan gambaran keseluruhan dan dengan tenang akan menentukan kelakuannya. Warisan Berbilang dalam Antara Muka Seperti yang anda sedia maklum, tiada warisan berbilang dalam Java. Terdapat banyak sebab untuk ini; kita akan melihatnya secara terperinci dalam kuliah yang berasingan. Dalam bahasa lain, sebagai contoh, dalam C++, ia adalah sebaliknya. Tanpa warisan berbilang, masalah serius timbul: objek yang sama boleh mempunyai beberapa ciri dan "tingkah laku" yang berbeza. Contoh dari kehidupan: untuk ibu bapa kita adalah anak, untuk guru kita adalah pelajar, untuk doktor kita adalah pesakit. Dalam kehidupan, kita muncul dalam peranan yang berbeza dan, oleh itu, berkelakuan berbeza: kita jelas akan bercakap dengan guru secara berbeza daripada rakan rapat. Mari cuba menterjemah situasi ini kepada kod. Bayangkan kita mempunyai dua kelas: Pond dan Aviary. Untuk kolam anda memerlukan burung berenang, dan untuk kandang burung anda memerlukan burung terbang. Untuk melakukan ini, kami mencipta dua kelas asas - FlyingBirddan Waterfowl.
public class Waterfowl {
}

public class FlyingBird {
}
Oleh itu, kami akan menghantar kepada kandang burung burung-burung yang kelasnya diwarisi daripada FlyingBird, dan ke kolam - mereka yang turun dari Waterfowl. Semuanya nampak mudah. Tetapi apa yang akan kita lakukan jika kita perlu mengenal pasti itik itu di suatu tempat? Dia berenang dan terbang. Tetapi kami tidak mempunyai banyak warisan. Nasib baik, Java menyediakan pelbagai pelaksanaan antara muka. Jika kelas tidak boleh mewarisi daripada beberapa ibu bapa, melaksanakan beberapa antara muka adalah mudah! Itik kita boleh terbang dan berenang :) Ia cukup untuk menggunakan antara muka FlyingBirddan bukannya Waterfowlkelas untuk mencapai hasil yang diingini.
public class Duck implements FlyingBird, Waterfowl {

   //методы обоих интерфейсов легко объединяются в одном классе

   @Override
   public void fly() {
       System.out.println("Летим!");
   }

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
Terima kasih kepada ini, program kami mengekalkan pengurusan kelas yang fleksibel, dan dalam kombinasi dengan pelaksanaan kaedah lalai, keupayaan kami untuk menentukan tingkah laku objek menjadi hampir tidak terhad! :)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION