JavaRush /Блоги Java /Random-TG /Синфҳои абстрактӣ дар Java бо мисолҳои мушаххас

Синфҳои абстрактӣ дар Java бо мисолҳои мушаххас

Дар гурӯҳ нашр шудааст
Салом! Дар лексияҳои қаблӣ мо бо интерфейсҳо шинос шуда , фаҳмидем, ки онҳо барои чӣ лозиманд. Мавзӯи имрӯза бо мавзӯи қаблӣ як чизи умумӣ хоҳад дошт. Биёед дар бораи синфҳои абстрактӣ дар Java сӯҳбат кунем. Синфҳои реферат дар Java бо мисолҳои мушаххас - 1

Чаро дарсҳо "абстрактӣ" номида мешаванд

Эҳтимол шумо дар хотир доред, ки "абстраксия" чист - мо онро аллакай фаро гирифтем :) Агар шумо ногаҳон фаромӯш карда бошед, хуб аст, биёед дар хотир дорем: ин принсипи OOP аст , ки мувофиқи он ҳангоми тарҳрезии синфҳо ва сохтани an objectҳо таъкид кардан лозим аст. танҳо хосиятҳои асосии an object ва дуюмдараҷаро партоед. Масалан, агар мо синф SchoolTeacher- муаллими мактабро тарҳрезӣ кунем, ба гумон аст, ки мо ба хусусияти " қадӣ " ниёз надорем. Воқеан: барои муаллим ин хислат муҳим нест. Аммо агар мо дар программа синф BasketballPlayer— баскетболбозро ташкил кунем, кадбаландй яке аз хусусиятхои асосй мегардад. Ҳамин тавр, синфи абстрактӣ абстракттарин ва тахминии "холӣ" барои як гурӯҳи синфҳои оянда аст. Ин тайёриро дар шакли тайёри худ истифода бурдан мумкин нест - он хеле "хом" аст. Аммо он вазъият ва рафтори муайяни умумиро тавсиф мекунад, ки синфҳои оянда - ворисони синфи абстрактӣ доранд.

Намунаҳои синфи абстрактии Java

Биёед мисоли оддиро бо мошинҳо бубинем:
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;
   }
}
Чунин аст соддатарин синфи абстрактӣ. Тавре ки шумо мебинед, ҳеҷ чизи махсусе нест :) Он барои чӣ лозим аст? Пеш аз ҳама, ӯ an objectеро, ки ба мо лозим аст, ба таври абстрактӣ - мошин тасвир мекунад. Калимаи абстракт барои як сабаб вуҷуд дорад. Дар чахон «мошинхои оддй» нестанд. Мошинҳои боркаш, мошинҳои пойга, седан, купе, SUV мавҷуданд. Синфи абстрактии мо танҳо як “нақша” аст, ки мо баъдтар аз он синфҳои автомобилӣ эҷод мекунем.
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!");
   }

}
Ин хеле ба он чизе монанд аст, ки мо дар лексияҳо дар бораи мерос сӯҳбат кардем. Танҳо дар он ҷо мо синф Carва усулҳои он доштем, ки абстрактӣ набуданд. Аммо ин ҳалли як қатор камбудиҳо дорад, ки дар синфҳои абстрактӣ ислоҳ карда мешаванд. Пеш аз ҳама, намунаи синфи абстрактӣ эҷод карда намешавад:
public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Error! The Car class is abstract!
   }
}
Ин «ҳил» махсусан аз ҷониби эҷодкорони Java амалӣ карда шудааст. Бори дигар, танҳо дар хотир бояд дошт: синфи абстрактӣ танҳо нақшаи дарсҳои ояндаи "муқаррарӣ" аст . Ба шумо нусхаҳои расм лозим нест, дуруст? Пас, зарурати эҷоди мисолҳои синфи абстрактӣ вуҷуд надорад :) Ва агар синф Carабстрактӣ намебуд, мо метавонем an objectҳои онро ба осонӣ эҷод кунем:
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
   }
}
Акнун мо дар барномаи худ як навъ мошини нофаҳмо дорем — на мошини боркаш, на мошини пойга, на седан, балки умуман чизе. Ҳамон «машинае», ки дар табиат вуҷуд надорад. Айнан ҳамин мисолро бо ҳайвонот овардан мумкин аст. Тасаввур кунед, ки оё an objectҳо дар барномаи шумо пайдо шудаанд Animal- " танҳо ҳайвон ". Он чӣ гуна аст, ба кадом оила тааллуқ дорад, кадом хусусиятҳо дорад, маълум нест. Дар барнома дидани ӯ аҷиб мебуд. Дар табиат ягон «ҳайвонот» вуҷуд надорад. Танҳо сагҳо, гурбаҳо, рӯбоҳҳо, морҳо ва дигарон. Синфҳои абстрактӣ моро аз " an objectҳои одӣ " озод мекунанд. Онҳо ба мо давлат ва рафтори асосӣ медиҳанд. Масалан, ҳама мошинҳо бояд модел , ранг ва суръати максималӣ дошта бошанд ва онҳо инчунин бояд қобorяти газ ва тормоз дошта бошанд . Ҳамааш ҳамин. Ин як нақшаи абстрактии умумӣ аст, пас шумо худатон синфҳои лозимиро тарҳрезӣ мекунед. Лутфан таваҷҷӯҳ намоед: ду усул дар синфи абстрактӣ низ ҳамчун абстракт таъин карда мешаванд ва онҳо умуман амалӣ карда намешаванд. Сабаб як аст: синфҳои абстрактӣ барои "мошинҳои оддӣ" "рафтори пешфарз" эҷод намекунанд. Онҳо танҳо мегӯянд, ки онҳо бояд ҳама мошинҳоро созанд. Аммо, агар шумо ба ҳар ҳол ба рафтори пешфарз ниёз доред, шумо метавонед усулҳоро дар синфи абстрактӣ татбиқ кунед. Java инро манъ намекунад:
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();
   }
}
Натиҷаи консол: "Суръат кунед!" Чи тавре ки мебинед, мо як методро дар синфи абстрактй чорй кардем, дуюмро ба амал наовардем. Дар натиҷа, рафтори синфи мо Sedanба ду қисм тақсим шуд: агар шумо методеро дар он даъват кунед gas(), он аз синфи абстрактии волидайн "барояд" Carва brake()мо методро дар синф аз нав муайян кардем Sedan. Он хеле қулай ва чандир баромад. Аммо ҳоло синфи мо он қадар абстракт нест ? Охир, дар хакикат нисфи усулхои у амалй мегардад. Дар асл - ва ин хусусияти хеле муҳим аст - синф абстрактӣ аст, агар ақаллан яке аз усулҳои он абстрактӣ бошад . Ҳадди ақал яке аз ду, ҳадди аққал яке аз ҳазор усул - муҳим нест. Мо ҳатто метавонем ҳамаи усулҳоро амалӣ кунем ва ҳеҷ гуна абстрактиро нагузорем. Синфи абстрактӣ бидуни усулҳои абстрактӣ вуҷуд дорад. Аслан, ин имконпазир аст ва компилятор хато намекунад, аммо беҳтар аст, ки ин корро накунед: калимаи абстракт маънои худро гум мекунад ва ҳамкасбони барномасозони шумо аз дидани ин хеле ҳайрон мешаванд:/ Илова бар ин, агар метод бо калимаи абстракт қайд карда мешавад, ҳар як синфи насл бояд амалӣ ё абстракт эълон карда шавад. Дар акси ҳол, компилятор хато мекунад . Албатта, ҳар як синф метавонад танҳо аз як синфи абстрактӣ мерос гирад, аз ин рӯ аз нуқтаи назари мерос байни синфҳои абстрактӣ ва муқаррарӣ фарқият вуҷуд надорад. Фарқ надорад, ки мо аз синфи абстрактӣ мерос мегирем ё аз синфи муқаррарӣ, танҳо як синфи волидайн вуҷуд дошта метавонад.

Чаро дар Java мероси якчанд синф вуҷуд надорад?

Мо аллакай гуфта будем, ки дар Java мероси сершумор вуҷуд надорад, аммо мо аслан фаҳмидем, ки чаро. Биёед ҳоло инро кӯшиш кунем. Гап дар он аст, ки агар Java мероси сершумор дошта бошад, синфҳои кӯдакона наметавонанд қарор кунанд, ки кадом рафторро интихоб кунанд. Фарз мекунем, ки мо ду синф дорем - Tosterва 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("Взрыв!");
   }
}
Тавре ки шумо мебинед, ҳарду усул доранд on(). Дар сурати тостер он ба пухтани тост шурӯъ мекунад ва дар мавриди бомбаи ҳастаӣ таркишро ба вуҷуд меорад. Оҳ :/ Акнун тасаввур кунед, ки шумо қарор додед (намедонам, ки чаро ногаҳон!) дар байни онҳо чизе эҷод кунед. Ва инак синфи шумо - MysteriousDevice! Ин code, албатта, кор намекунад ва мо онро танҳо ҳамчун намунаи "чӣ гуна метавонист" пешниҳод кунем:
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?
   }
}
Биёед бубинем, ки мо чӣ дорем. Дастгоҳи пурасрор ҳам аз тостер ва ҳам аз бомбаи ҳастаӣ меояд. Ҳарду усул доранд on()ва дар натиҷа маълум нест, ки агар мо онро даъват кунем, кадом усул on()бояд ба an object оташ занад MysteriousDevice. Объект инро дарк карда наметавонад. Хуб, ҳамчун гелос дар торт: бомбаи ҳастаӣ усуле надорад off(), бинобар ин, агар мо нодуруст тахмин карда бошем, ҳеҷ гуна роҳи хомӯш кардани дастгоҳ вуҷуд надорад. Синфҳои реферат дар Java бо мисолҳои мушаххас - 2 Маҳз аз сабаби ин нофаҳмиҳо, вақте ки an object маълум нест, ки кадом рафторро бояд интихоб кунад, созандагони Java аз мероси сершумор даст кашиданд. Аммо, шумо дар хотир доред, ки синфҳои Java интерфейсҳои зиёдеро амалӣ мекунанд. Дар омади гап, шумо аллакай дар таҳсилатон ҳадди аққал як синфи абстрактӣ дучор шудаед! Ҳарчанд, шояд ман инро пайхас накардаам :)
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
Ин дӯсти деринаи шумо - синфи аст Calendar. Он абстракт буда, якчанд ворисон дорад. Яке аз онхост GregorianCalendar. Шумо аллакай онро дар дарсҳо оид ба санаҳо истифода мебурд :) Ҳама чиз равшан ба назар мерасад, танҳо як нукта боқӣ мондааст: фарқияти асосии байни синфҳои абстрактӣ ва интерфейсҳо дар чист ? Чаро онҳо ҳардуро ба Java илова карданд ва танҳо бо як нафар маҳдуд нашуданд? Ин метавонад кофӣ бошад. Мо дар ин бора дар лекцияи оянда гап мезанем! То дидор:)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION