JavaRush /Блоги Java /Random-TG /Мероси синфҳои лона

Мероси синфҳои лона

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо кори як механизми муҳим - мерос дар синфҳои лонаро дида мебароем. Ман намедонам, ки шумо ягон бор дар бораи он фикр кардаед, ки вақте ки шумо бояд синфи лонаро аз синфи дигар мерос гиред, чӣ кор хоҳед кард. Агар не, ба ман бовар кунед: ин вазъият метавонад печида бошад, зеро дар ин ҷо нозукиҳои зиёде мавҷуданд:
  1. Оё мо синфи лонаро аз ягон синф мерос мегирем ё синфи дигарро аз синфи лона мерос мегирем?
  2. Оё ворисон/ворис як синфи муқаррарии ҷамъиятӣ аст ё он ҳам синфи лона аст?
  3. Ниҳоят, мо дар ҳамаи ин ҳолатҳо кадом навъи синфҳои лонаро истифода мебарем?
Агар шумо ба ҳамаи ин саволҳо ҷавоб диҳед, он қадар ҷавобҳои имконпазир пайдо мешаванд, ки саратон чарх мезанад :) Тавре ки шумо медонед, барои ҳалли як масъалаи мураккаб онро ба қисмҳои соддатар тақсим кардан лозим аст. Ин аст он чизе ки мо мекунем. Биёед ҳар як гурӯҳи синфҳои лонаро бо навбат аз ду ҷиҳат дида бароем: кӣ метавонад аз ин навъи синфи лона мерос гирад ва аз кӣ мерос гирад. Биёед бо синфҳои лонаҳои статикӣ оғоз кунем.

Синфҳои лонаҳои статикӣ

Намунаҳои меросгирии синфҳои дохилӣ - 2Қоидаҳои мероси онҳо соддатарин аст. Дар ин ҷо шумо метавонед қариб ҳама чизеро, ки дилатон мехоҳад, иҷро кунед. Синфи лонашудаи статикиро аз: мерос гирифтан мумкин аст:
  • синфи муқаррарӣ
  • синфи лонашудаи статикӣ, ки дар синфи беруна ё аҷдодони он эълон шудааст
Биёед мисоли лексияро дар бораи синфҳои лонаҳои статикӣ ба ёд орем.
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
Биёед кӯшиш кунем, ки codeро тағир диҳем ва синфи статикии лона Drawingва насли онро созем - Boeing737Drawing.
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

   }

   public static class Boeing737Drawing extends Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
Тавре ки шумо мебинед, ҳеҷ мушкиле нест. Мо метавонем синфро комилан хориҷ кунем Drawingва онро ба ҷои синфи статикӣ як синфи муқаррарии ҷамъиятӣ гардонем - ҳеҷ чиз тағир намеёбад.
public class Drawing {

}

public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Boeing737Drawing extends Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
Ин тартиб дода шудааст. Ва кадом синфҳо метавонанд аз синфҳои статикӣ мерос гиранд? Қариб ҳама! Ҷойгиршуда/мунтазам, статикӣ/ғайристатикӣ - муҳим нест. Дар ин ҷо мо синфи дохorро Boeing737Drawingаз синфи лонашудаи статикӣ мерос мегирем Drawing:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

   }

   public class Boeing737Drawing extends Drawing {

       public int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
Шумо метавонед як мисоли Boeing737Drawingзеринро эҷод кунед:
public class Main {

   public static void main(String[] args) {

      Boeing737 boeing737 = new Boeing737(1990);
      Boeing737.Boeing737Drawing drawing = boeing737.new Boeing737Drawing();
      System.out.println(drawing.getMaxPassengersCount());

   }

}
Ҳарчанд синфи мо Boeing737Drawingаз синфи статикӣ мерос гирифта бошад ҳам, худаш статикӣ нест! Аз ин рӯ, он ҳамеша ба як намунаи синфи берунӣ ниёз дорад. Мо метавонем синфро Boeing737Drawingаз синф хориҷ кунем Boeing737ва онро танҳо як синфи ҷамъиятӣ гардонем. Ҳеҷ чиз тағир намеёбад - он инчунин метавонад аз лонаҳои статикӣ мерос гирад Drawing.
public class Boeing737 {

   private int manufactureYear;
   public static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

   }
}

public class Boeing737Drawing extends Boeing737.Drawing {

   public int getMaxPassengersCount() {

       return Boeing737.maxPassengersCount;

}
Ягона нуктаи муҳим: дар ин ҳолат мо бояд тағирёбандаи статикиро maxPassengersCountоммавӣ кунем. Агар он махфӣ боқӣ монад, синфи муқаррарии ҷамъиятӣ ба он дастрасӣ надорад. Мо синфҳои статикиро ҷудо кардем! :) Акнун биёед ба синфҳои дохилӣ гузарем. Тавре ки шумо дар ёд доред, 3 намуди онҳо вуҷуд доранд: синфҳои оддӣ, синфҳои маҳаллӣ ва синфҳои дохorи номаълум. Намунаҳои меросгирии синфҳои дохилӣ - 3Боз, биёед аз оддӣ ба мураккаб гузарем :)

Синфҳои дохorи беном

Синфи дохorи беном наметавонад аз синфи дигар мерос гирад. Ягон синфи дигар аз синфи номаълум мерос гирифта наметавонад. Ин соддатар буда наметавонист! :)

Синфҳои маҳаллӣ

Синфҳои маҳаллӣ (агар шумо фаромӯш карда бошед) дар дохor блоки codeи синфи дигар эълон карда мешаванд. Аксар вақт - дар дохor баъзе усули ин синфи берунӣ. Мантиқӣ аст, ки танҳо синфҳои дигари маҳаллӣ дар дохor як метод (ё блок) метавонанд аз синфи маҳаллӣ мерос гиранд. Инак як мисол:
public class PhoneNumberValidator {

   public void validatePhoneNumber(final String number) {

       class PhoneNumber {

           private String phoneNumber;

           public PhoneNumber() {
               this.phoneNumber = number;
           }

           public String getPhoneNumber() {
               return phoneNumber;
           }

           public void setPhoneNumber(String phoneNumber) {
               this.phoneNumber = phoneNumber;
           }
       }

       class CellPhoneNumber extends PhoneNumber {

       }

       class LandlinePhoneNumber extends PhoneNumber {


       }

       //...code валидации номера
   }
}
Ин рамзи лексияи мо дар бораи синфҳои маҳаллӣ мебошад. Дар дохor синфи санҷиши рақамҳо мо синфи маҳаллӣ дорем PhoneNumber- рақами телефон. Агар барои мақсадҳои мо ба мо лозим ояд, ки аз он ду an objectи ҷудогона, масалан, рақами телефони мобилӣ ва рақами телефони статсионариро ҷудо кунем, мо метавонем ин корро танҳо дар як усул иҷро кунем. Сабаб оддӣ аст: доираи синфи маҳаллӣ дар дохor усул (блок) аст, ки дар он эълон карда мешавад. Аз ин рӯ, мо наметавонем онро ба таври берунӣ истифода барем (аз ҷумла барои мерос). Аммо, худи синфи маҳаллӣ барои мерос имкониятҳои васеътар дорад! Синфи маҳаллӣ метавонад аз:
  1. Синфи муқаррарӣ.
  2. Синфи ботинӣ, ки дар як синф бо синфи маҳаллӣ ё дар аҷдодони он эълом шудааст.
  3. Аз синфи дигари маҳаллӣ дар ҳамон усул (блок) эълом шудааст.
Нуктахои якум ва сеюм равшан ба назар мерасанд, вале дуюмаш андаке печида аст:/ Биёед ду мисолро дида бароем. Мисоли 1 - "вориси синфи маҳаллӣ аз синфи дохилӣ, ки дар як синф бо синфи маҳаллӣ эълон шудааст":
public class PhoneNumberValidator {

   class PhoneNumber {

       private String phoneNumber;

       public PhoneNumber(String phoneNumber) {
           this.phoneNumber = phoneNumber;
       }

       public String getPhoneNumber() {
           return phoneNumber;
       }

       public void setPhoneNumber(String phoneNumber) {
           this.phoneNumber = phoneNumber;
       }
   }

   public void validatePhoneNumber(final String number) {

       class CellPhoneNumber extends PhoneNumber {

           public CellPhoneNumber(String phoneNumber) {
               super(number);
           }
       }

       class LandlinePhoneNumber extends PhoneNumber {

           public LandlinePhoneNumber(String phoneNumber) {
               super(number);
           }
       }

       //...code валидации номера
   }
}
Дар ин ҷо мо синфро PhoneNumberаз метод хориҷ кардем validatePhoneNumber()ва онро ба ҷои маҳаллӣ дохил кардем. Ин ба мо халал намерасонад, ки 2 синфи маҳаллии худро аз он мерос гирем. Мисоли 2 - "... ё дар аҷдодони ин синф." Ин ҷо ҷолибтар мешавад. Мо метавонем онро PhoneNumberаз занҷири мерос боз ҳам баландтар барем. Биёед синфи абстрактиро эълон кунем AbstractPhoneNumberValidator, ки аҷдодони мо хоҳад шуд PhoneNumberValidator:
public abstract class AbstractPhoneNumberValidator {

   class PhoneNumber {

       private String phoneNumber;

       public PhoneNumber(String phoneNumber) {
           this.phoneNumber = phoneNumber;
       }

       public String getPhoneNumber() {
           return phoneNumber;
       }

       public void setPhoneNumber(String phoneNumber) {
           this.phoneNumber = phoneNumber;
       }
   }

}
Тавре ки шумо мебинед, мо на танҳо онро эълон кардем, балки синфи дохorро низ ба он интиқол додем PhoneNumber. Аммо, дар синфи насли худ - PhoneNumberValidator- синфҳои маҳаллӣ дар усулҳо метавонанд аз PhoneNumber!
public class PhoneNumberValidator extends AbstractPhoneNumberValidator {

   public void validatePhoneNumber(final String number) {

       class CellPhoneNumber extends PhoneNumber {

           public CellPhoneNumber(String phoneNumber) {
               super(number);
           }
       }

       class LandlinePhoneNumber extends PhoneNumber {

           public LandlinePhoneNumber(String phoneNumber) {
               super(number);
           }
       }

       //...code валидации номера
   }
}
Ба шарофати пайвастшавӣ тавассути мерос, синфҳои маҳаллӣ дар дохor синфи насл синфҳои дохorи аҷдодро "мебинанд". Ва ниҳоят, биёед ба гурӯҳи охирин мегузарем :)

Синфҳои дохилӣ

Синфи дохилӣ метавонад аз ҷониби синфи дигари дохилӣ, ки дар ҳамон синфи берунӣ (ё насли он) эълон шудааст, мерос гирифта шавад. Биёед инро бо мисоли велосипед аз лексия дар бораи синфҳои дохилӣ дида бароем.
public class Bicycle {

   private String model;
   private int mawWeight;

   public Bicycle(String model, int mawWeight) {
       this.model = model;
       this.mawWeight = mawWeight;
   }

   public void start() {
       System.out.println("Go!");
   }

   class Seat {

       public void up() {

           System.out.println("Сидение поднято выше!");
       }

       public void down() {

           System.out.println("Сидение опущено ниже!");
       }
   }

   class SportSeat extends Seat {

       //...methods
   }
}
BicycleДар ин ҷо мо синфи дохorро дар дохor синф эълон кардем Seat- курсӣ. Аз он як намуди махсуси курсиҳои пойга мерос гирифта шуд - SportSeat. Бо вуҷуди ин, мо метавонем як намуди алоҳидаи "велосипедҳои пойга" эҷод кунем ва онро ба як синфи алоҳида гузорем:
public class SportBicycle extends Bicycle {

   public SportBicycle(String model, int mawWeight) {
       super(model, mawWeight);
   }


   class SportSeat extends Seat {

       public void up() {

           System.out.println("Сидение поднято выше!");
       }

       public void down() {

           System.out.println("Сидение опущено ниже!");
       }
   }
}
Ин хам имконпазир аст. Синфи ботинии кӯдак ( SportBicycle.SportSeat) синфҳои ботинии ниёгонро «мебинад» ва метавонад аз онҳо мерос гирад. Мерос аз синфҳои дохилӣ як хусусияти муҳим дорад! Дар ду мисоли қаблӣ мо SportSeatдохилӣ доштем. Аммо чӣ мешавад, агар мо тасмим гирем, ки онро SportSeatба синфи муқаррарии ҷамъиятӣ табдил диҳем, ки он ҳам аз синфи дохилӣ мерос мегирад Seat?
//ошибка! No inclosing instance of  type 'Bicycle' is in scope
class SportSeat extends Bicycle.Seat {

   public SportSeat() {

   }

   public void up() {

       System.out.println("Сидение поднято выше!");
   }

   public void down() {

       System.out.println("Сидение опущено ниже!");
   }
}
Мо хато гирифтем! Оё шумо тахмин карда метавонед, ки он бо чӣ алоқаманд аст? :) Ин оддӣ аст. Вақте ки мо дар бораи синфи дохилӣ сӯҳбат кардем Bicycle.Seat, мо қайд кардем, ки созандаи синфи дохилӣ ба таври ғайримустақим истинодро ба an objectи синфи берунӣ медиҳад. Аз ин рӯ, бидуни сохтани an object Bicycleшумо наметавонед an objectро эҷод кунед Seat. Дар бораи офариниш чӣ гуфтан мумкин аст SportSeat? Он як механизми дарунсохташуда барои ба таври ғайримустақим интиқол додани истинод ба an objectи синфи берунӣ дар конструктор надорад, ки дар Seat. Аммо, бидуни an object Bicycle, ба монанди дар мавриди Seat, мо наметавонем an object эҷод кунем SportSeat. Аз ин рӯ, мо танҳо як кор дорем - ба таври возеҳ SportSeatистинод ба an objectро ба конструктор гузаронем. BicycleИн аст, ки чӣ тавр иҷро карда мешавад:
class SportSeat extends Bicycle.Seat {

   public SportSeat(Bicycle bicycle) {

       bicycle.super();
   }

   public void up() {

       System.out.println("Сидение поднято выше!");
   }

   public void down() {

       System.out.println("Сидение опущено ниже!");
   }
}
Барои ин мо калимаи махсусро истифода мебарем super(); Акнун, агар мо хоҳем, ки an object эҷод кунем SportSeat, ҳеҷ чиз моро аз ин кор бозмедорад:
public class Main {

   public static void main(String[] args) {

       Bicycle bicycle = new Bicycle("Peugeot", 120);
       SportSeat peugeotSportSeat = new SportSeat(bicycle);

   }
}
Оҳ, лексия хеле калон буд :) Аммо шумо бисёр чизҳои навро омӯхтед! Ҳоло вақти ҳалли баъзе мушкилот аст! :)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION