JavaRush /Java Blog /Random-TK /Java-da anyk mysallar bilen abstrakt sapaklar

Java-da anyk mysallar bilen abstrakt sapaklar

Toparda çap edildi
Salam! Öňki leksiýalarda interfeýsler bilen tanyşdyk we olaryň nämä mätäçdigini bildik. Şu günki mowzugyň öňki mowzugy bilen umumy bir zady bolar. Java-da abstrakt sapaklar barada gürleşeliň . Java-da anyk mysallar bilen abstrakt sapaklar - 1

Näme üçin sapaklara "abstrakt" diýilýär?

Abstraksiýanyň nämedigini ýadyňyzda bolsa gerek - biz eýýäm ýapdyk :) Birden ýatdan çykaran bolsaňyz, gowy däl, ýadyňyzdan çykarmaň: bu OOP prinsipidir , şoňa görä synplar düzülende we obýektler döredilende hökmanydyr diňe bir guramanyň esasy aýratynlyklaryny belläň we ikinji derejeli zatlaryny taşlaň. Mysal üçin, synp düzýän bolsak - mekdep mugallymy - “ beýiklikSchoolTeacher ” häsiýetine mätäç bolmaz . Hakykatdanam: mugallym üçin bu häsiýet möhüm däl. Theöne programmada bir synp döredsek - basketbolçy - beýiklik esasy aýratynlyklaryň birine öwrüler. Şeýlelik bilen, abstrakt synp geljekki synplar topary üçin iň abstrakt, takmynan “boş”. Bu taýýarlygy taýýar görnüşinde ulanyp bolmaýar - gaty “çig”. Itöne geljekki synplaryň - abstrakt synpyň mirasdüşerleriniň boljak belli bir umumy ýagdaýyny we özüni alyp barşyny suratlandyrýar. BasketballPlayer

Java abstrakt synp mysallary

Maşynlar bilen ýönekeý bir meselä seredeliň:
public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public abstract void gas();

   public abstract void brake();

   public String getModel() {
       return model;
   }

   public void setModel(String model) {
       this.model = model;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getMaxSpeed() {
       return maxSpeed;
   }

   public void setMaxSpeed(int maxSpeed) {
       this.maxSpeed = maxSpeed;
   }
}
Iň ýönekeý abstrakt synpyň görnüşi. Görşüňiz ýaly üýtgeşik zat ýok :) Oňa näme gerek bolup biler? Ilki bilen, bize gerekli zady mümkin boldugyça abstrakt suratlandyrýar. Abstrakt sözi bir sebäbe görä şu ýerde. Dünýäde “diňe maşynlar” ýok. Ucksük awtoulaglary, ýaryş awtoulaglary, sedanlar, kupesler, ulaglar bar. Abstrakt synpymyz diňe “meýilnama” bolup, soňundan awtoulag sapaklaryny dörederis.
public class Sedan extends Car {

   @Override
   public void gas() {
       System.out.println("The sedan accelerates!");
   }

   @Override
   public void brake() {
       System.out.println("The sedan slows down!");
   }

}
Bu, miras hakda leksiýalarda gürleşenimize meňzeýär. Diňe şol ýerde synpymyz Carwe abstrakt däl usullary bardy. Emma bu çözgüdiň abstrakt synplarda düzedilýän birnäçe kemçilikleri bar. Ilki bilen abstrakt synpyň mysaly döredilip bilinmez:
public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Error! The Car class is abstract!
   }
}
Bu “hile” ýörite “Java” döredijiler tarapyndan amala aşyryldy. Againene-de bir gezek ýatda saklamaly: abstrakt synp geljekdäki "adaty" sapaklaryň meýilnamasydyr . Çyzuwyň nusgalary gerek däl, şeýlemi? Şonuň üçin abstrakt synpyň mysallaryny döretmegiň zerurlygy ýok :) Eger synp Carabstrakt bolmadyk bolsa, biz onuň obýektlerini aňsatlyk bilen döredip bilerdik:
public class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       // some logic
   }

   public  void brake() {
       // some logic
   }
}


public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Everything is OK, the machine has been created
   }
}
Indi programmamyzda haýsydyr bir düşnüksiz awtoulag bar - ýük awtoulagy däl, ýaryş awtoulagy däl, sedan däl, umuman bir zat. Tebigatda ýok şol bir “diňe maşyn”. Şeýle mysal haýwanlar bilen hem berilip bilner. Programmaňyzda obýektleriň peýda bolandygyny göz öňüne getiriň Animal- “ diňe haýwan ”. Onuň haýsy görnüşi, haýsy maşgala degişlidigi, haýsy aýratynlyklary barlygy belli däl. Ony programmada görmek geň bolardy. Tebigatda “diňe haýwanlar” ýok. Diňe itler, pişikler, tilkiler, mollar we başgalar. Abstrakt sapaklar bizi “ diňe obýektlerden ” azat edýär. Bize esasy ýagdaýy we özüni alyp barşyny berýär. Mysal üçin, ähli awtoulaglaryň modeli , reňki we iň ýokary tizligi bolmaly , şeýle hem gaz we tormozlamagy başarmaly . Bu hemmesi. Bu umumy abstrakt shema, soň özüňize zerur sapaklary düzýärsiňiz. Üns beriň: abstrakt synpda iki usul hem abstrakt hökmünde kesgitlenýär we olar asla durmuşa geçirilmeýär. Munuň sebäbi birmeňzeş: abstrakt synplar "ýönekeý maşynlar" üçin "adaty hereket" döretmeýär. Justhli awtoulaglary ýasamagy başarmaly diýýärler. Şeýle-de bolsa, size adaty hereket gerek bolsa, abstrakt synpda usullary durmuşa geçirip bilersiňiz. Java muny gadagan etmeýär:
public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       System.out.println("Let's go!");
   }

   public abstract void brake();

   //getters and setters
}


public class Sedan extends Car {

   @Override
   public void brake() {
       System.out.println("The sedan slows down!");
   }

}

public class Main {

   public static void main(String[] args) {

       Sedan sedan = new Sedan();
       sedan.gas();
   }
}
Konsol çykyşy: “Çaltlaşyň!” Görşüňiz ýaly abstrakt synpda bir usuly durmuşa geçirdik, ýöne ikinjisini durmuşa geçirmedik. Netijede, synpymyzyň özüni alyp barşy Sedaniki bölege bölündi: eger bir usul diýseňiz gas(), ene-atanyň abstrakt synpyndan “çykar” Carwe brake()synpda usuly täzeden kesgitledik Sedan. Örän amatly we çeýe boldy. Nowöne indi synpymyz beýle abstrakt dälmi ? Galyberse-de, aslynda onuň usullarynyň ýarysy durmuşa geçirilýär. Aslynda - we bu örän möhüm aýratynlyk - iň azyndan usullaryndan biri abstrakt bolsa, synp abstrakt . Iň bolmanda ikisinden biri, iň bolmanda müň usuldan biri - bu möhüm däl. Hatda ähli usullary durmuşa geçirip bileris we abstrakt usullary goýup bilmeris. Abstrakt usullar bolmazdan abstrakt synp bolar. Aslynda bu mümkindir we düzüji ýalňyşlyk goýbermez, ýöne muny etmezlik has gowudyr: abstrakt sözi manysyny ýitirer we beýleki programmaçylaryňyz muny görüp gaty geň galarlar: / Mundan başga-da, bir usul bolsa abstrakt sözi bilen bellenýär, her nesil synpy durmuşa geçirmeli ýa-da abstrakt yglan edilmeli. Otherwiseogsam düzüji ýalňyşlyk goýberer . Elbetde, her synp diňe bir abstrakt synpdan miras alyp biler, şonuň üçin miras nukdaýnazaryndan abstrakt we adaty synplaryň arasynda tapawut ýok. Abstrakt synpdan ýa-da adaty bir synpdan miras almagymyzyň ähmiýeti ýok, diňe bir ene-atalar synpy bolup biler.

Näme üçin Java-da köp synp mirasy ýok?

Java-da köp mirasyň ýokdugyny aýdypdyk, ýöne munuň sebäbini hakykatdanam bilip bilmedik. Geliň indi synap göreliň. Esasy zat, eger Java-da birnäçe miras bolan bolsa, çagalar synplary haýsy özüni alyp barmalydygyny çözüp bilmezler. Iki synpymyz bar diýeliň - Tosterwe NuclearBomb:
public class Toster {


 public void on() {

       System.out.println("The toaster is on, the toast is getting ready!");
   }

   public void off() {

       System.out.println("The toaster is off!");
   }
}


public class NuclearBomb {

   public void on() {

       System.out.println("Взрыв!");
   }
}
Görşüňiz ýaly, ikisiniňem usuly bar on(). Tost meselesinde tost bişirip başlaýar, ýadro bombasy bolsa partlama sebäp bolýar. Aý: / Indi aralarynda bir zat döretmek kararyna gelendigiňizi göz öňüne getiriň (näme üçin birdenkä bilemok!). Ine, bu siziň synpyňyz - MysteriousDevice! Bu kod, elbetde, işlemeýär we biz ony “nädip bolup biljekdiginiň” mysaly hökmünde hödürleýäris:
public class MysteriousDevice extends Toster, NuclearBomb {

   public static void main(String[] args) {

       MysteriousDevice mysteriousDevice = new MysteriousDevice();
       mysteriousDevice.on(); // And what should happen here? Will we get a toast, or a nuclear apocalypse?
   }
}
Näme alanymyzy göreliň. Bu syrly enjam Toasterden we learadro bombasyndan gelýär. Ikisinde-de bir usul bar on()we netijede haýsy usula jaň etsek , haýsy on()usula ot bermelidigi belli däl. MysteriousDeviceObýekt muňa düşünip bilmez. Tortuň üstünde bir alça ýaly: learadro bombasynyň usuly ýok off(), şonuň üçin ýalňyş çaklasak, enjamy öçürip bolmaz. Java-da anyk mysallar bilen abstrakt sapaklar - 2 Hut haýsydyr bir obýekt haýsy hereketi saýlamalydygy belli bolmadyk mahaly, bu bulaşyklyk sebäpli Java döredijiler köp mirasdan ýüz öwürdiler. Şeýle-de bolsa, Java synplarynyň köp interfeýsi durmuşa geçirýändigini ýadyňyzdan çykarmaň. Theeri gelende aýtsak, okuwyňyzda eýýäm azyndan bir abstrakt synp bilen ýüzbe-ýüz bolduňyz! Garaz, belki duýmadym :)
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
Bu siziň köne dostuňyz - synpyňyz Calendar. Abstrakt we birnäçe mirasdüşeri bar. Şolaryň biri GregorianCalendar. Sene hakda sapaklarda eýýäm ulanypdyňyz :) Hemme zat düşnükli ýaly, diňe bir nokat galdy: abstrakt synplar bilen interfeýsleriň arasynda düýpli tapawut näme ? Näme üçin ikisini Java-a goşdular we diňe bir bilen çäklenmediler? Bu ýeterlik bolup biler. Bu barada indiki leksiýada gürleşeris! Görüşýänçäk:)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION