JavaRush /Блоги Java /Random-TG /instanceof ва асосҳои мерос

instanceof ва асосҳои мерос

Дар гурӯҳ нашр шудааст
Салом! Дар лекцияхои пештара мо бо мафхуми мерос якчанд маротиба ба таври мухтасар дучор шуда будем. Имрӯз мо низ ба ин мавзӯъ дахл хоҳем кард, аммо на он қадар амиқ. Дар ин бора баъдтар лексияи муфассал хонда мешавад, аммо имрӯз мо танҳо мисолҳои амалиро дида мебароем ва бо як оператори ҷолиб дар Java шинос мешавем.

мероси Java

Пас, мерос аслан чист? асосҳои instanceof ва мерос - 1Мерос як механизм дар барномасозӣ, аз ҷумла Java мебошад, ки ба шумо имкон медиҳад синфи навро дар асоси синфи мавҷуда тавсиф кунед. Синфи насли он гоҳ ба майдонҳо ва усулҳои синфи волидайн дастрасӣ пайдо мекунад. Чаро ин метавонад зарур бошад? Хуб, масалан, тасаввур кунед, ки шумо бояд дар барнома якчанд синфҳои мошинҳоро эҷод кунед: Truck, Racing, Sedan, Pickup ва ғайра. Ҳатто бидуни сар кардани навиштани code, шумо аниқ медонед, ки ин синфҳо чизҳои умумӣ доранд: ҳама мошинҳо номи модел, соли истеҳсол, андозаи муҳаррик, суръати максималӣ ва ғайра доранд. (дар бораи он, ки хамаи онхо чарху дигар кисмхо доранд). Дар чунин вазъият шумо метавонед:
  • Ин майдонҳоро дар ҳар як синф эҷод кунед ва ҳангоми сохтани онҳо ба синфҳои нави мошин илова кунед
  • Майдонҳои барои ҳама мошинҳо маъмулро ба синфи волидайн интиқол диҳед Carва ҳамаи синфҳои намудҳои мушаххаси мошинҳо аз Carистифодаи калимаи extensions мерос мегиранд .
Варианти дуюм, албатта, хеле қулайтар аст:
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 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);
   }
}
Ҳадди ақал, мо аз такрори нолозими code худдорӣ кардем ва ин чизест, ки мо бояд ҳамеша ҳангоми навиштани барномаҳо барои он саъй кунем. Илова бар ин, мо сохтори оддии синфӣ ва фаҳмо дорем: майдонҳои барои ҳама мошинҳо умумӣ дар як синф ҷойгир карда шудаанд. Агар, масалан, мошинҳои боркаш як қатор майдонҳои мушаххас дошта бошанд, ки мошинҳои дигар надоранд, онҳо метавонанд дар Truck. Ҳамин чиз ба усулҳо дахл дорад. Ҳама мошинҳо як рафтори умумӣ доранд, ки онҳоро тавсиф кардан мумкин аст: мошинро оғоз кунед, газ/тормоз ва ғайра. Ин усулҳои умумиро метавон дар синфи умумӣ ҷойгир кард Carва рафтори мушаххаси ҳар як намуди мушаххасро дар синфҳои наслӣ тавсиф кардан мумкин аст.
public class Car {

   public void gas() {
       //...gas
   }

   public void brake() {
       //...brake
   }
}


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();
   }
}
Мо усулҳои умумии ҳамаи мошинҳоро ба синф гузаронидем Car. Аммо дар синфи вориси F1CarФормула 1, ки мошинҳои пойгаро тавсиф мекунанд - пит-стокҳо (истгоҳҳо барои нигоҳдории таъҷorи мошин), ки танҳо дар мусобиқа анҷом дода мешаванд ва бо рафтори мушаххас фарқ мекунанд.

Java намунаи оператор

Барои санҷидани он ки оё an object дар асоси синф сохта шудааст, дар Java оператори махсус мавҷуд аст - instanceof. Он арзишро бармегардонад, trueагар санҷиш дуруст бошад ё falseнатиҷа нодуруст бошад. Биёед бубинем, ки он бо истифода аз синфҳои автомобorи мо ҳамчун намуна чӣ гуна кор мекунад:
public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
Натиҷа: ҳақиқӣ Санҷӣ бо истифода аз оператор instanceofбаргашт true, зеро мо an objectи синф дорем Truckва ҳама мошинҳои боркаш мошин мебошанд. Синф Truckнасли синф аст Car, бинобар ин, ҳама мошинҳои боркаш дар асоси волидайни умумӣ - мошин сохта шудаанд. Ба оператор диққат диҳед instanceof: он бе нуқта навишта шудааст, зеро он оператор аст, на усул ("an objectи мисоли Синф"). Биёед онро ба таври дигар санҷем:
public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Натиҷа: бардурӯғ Синф Carва мувофиқан, an objectи он аз синфи Truck.Ҳама мошинҳои боркаш автомобил мебошанд, аммо на ҳама мошинҳо мошини боркаш мебошанд. Объектҳо Carдар асоси синф сохта намешаванд Truck. Боз як мисол:
public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
Натиҷа: Дуруст Мантиқ дар ин ҷо низ оддӣ аст: ҳама синфҳо дар Java, аз ҷумла синфҳое, ки шумо офаридаед, аз як синф бармеоянд Object(гарчанде ки шумо наменависед Объектро дар онҳо васеъ мекунад - ин механизм дар онҳо номуайян аст). Чаро ин метавонад муфид бошад ва дар кадом ҳолатҳо? Истифодаи маъмултарини оператор instanceofҳамчун усули бекоркунӣ мебошад equals(). Масалан, ин аст, ки ин усул equalsдар синф чӣ гуна татбиқ карда мешавад String:
public boolean equals(Object anObject) {
   if (this == anObject) {
       return true;
   }
   if (anObject instanceof String) {
       String anotherString = (String) anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
           char v1[] = value;
           char v2[] = anotherString.value;
           int i = 0;
           while (n-- != 0) {
               if (v1[i] != v2[i])
                       return false;
               i++;
           }
           return true;
       }
   }
   return false;
}
Пеш аз муқоисаи сатр бо an objectи гузаронидашуда, усул месанҷад: оё an objectи гузаронидашуда воқеан сатр аст? Ва танхо баъд ба мукоисаи хосиятхои ду an object шуруъ мекунад. Бе ин тафтиш шумо метавонед ягон an objectеро, ки майдонҳои арзиш ва дарозӣ дорад, ба метод гузаред ва онро бо сатр муқоиса кунед, ки ин, албатта, нодуруст аст.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION