JavaRush /Блоги Java /Random-TG /Усулҳои пешфарз дар интерфейсҳо

Усулҳои пешфарз дар интерфейсҳо

Дар гурӯҳ нашр шудааст
Ҳар як versionи нави Java аз versionҳои қаблӣ фарқ мекунад. Ин аст як мисоли тағирот аз маводе, ки мо фаро гирифтем: Пеш аз Java 5, enumдар забон ҳарфҳо вуҷуд надоштанд.
Усулҳои пешфарз дар интерфейсҳо - 1
Ба ҳамин монанд, Java 8 аз Java 7 ба таври назаррас фарқ мекунад. Аксари лексияҳои мо дар versionи 7-уми забон навишта мешаванд, аммо, албатта, мо навовариҳои муҳимро сарфи назар намекунем. Азбаски мо дар ин лексия дар бораи интерфейсҳо гап мезанем, биёед як навсозӣ - усулҳои пешфарз дар интерфейсҳоро бубинем . Шумо аллакай медонед, ки интерфейс иҷро намешавад . Вазифаи он аз он иборат аст , ки чӣ гуна рафтори ҳама an objectҳое, ки онро амалӣ мекунанд, бояд дошта бошанд . Аммо аксар вақт таҳиягарон бо ҳолатҳое дучор меомаданд, ки татбиқи усул дар ҳама синфҳо якхела буд. Биёед мисоли мошини кӯҳнаи худро бубинем:
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("Тормоз!");
   }
}
Ба фикри шумо мушкor асосии ин code чист? Эҳтимол шумо пай бурдед, ки мо як қатор рамзро навиштем! Ин мушкилот дар барномасозӣ маъмул аст ва бояд пешгирӣ карда шавад. Чизи дигар ин аст, ки пеш аз нашри Java 8 ягон варианти махсуси ҳалли мушкилот вуҷуд надошт. Вақте ки ин version баромад, имкон пайдо шуд, ки усулҳои пешфарзро муайян кунед ва онҳоро бевосита дар дохor интерфейс татбиқ кунед! Ин аст, ки чӣ тавр иҷро карда мешавад:
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 {

}
Акнун усулҳо gas()ва brake(), ки барои ҳама мошинҳо якхела буданд, ба интерфейс дохил карда шудаанд ва рамзи такрорӣ лозим нест. Гузашта аз ин, усулҳо дар ҳар як синф дастрасанд!
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();
   }
}
Чӣ мешавад, агар 100 синф бо метод вуҷуд дошта бошанд gas(), аммо танҳо 99-тои онҳо рафтори якхела доранд? Ин ҳама чизро вайрон мекунад ва усули пешфарз дар ин ҳолат кор намекунад? Албатта не :) Усулҳои пешфарзи интерфейсҳо метавонанд бекор карда шаванд.
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
Ҳама 99 намуди мошинҳои дигар усули пешфарзро амалӣ мекунанд ва синф UnusualCar- истисно - тасвири умумиро вайрон намекунад ва рафтори онро оромона муайян мекунад. Мероси чандкарата дар интерфейсҳо Тавре ки шумо аллакай медонед, дар Java мероси сершумор вуҷуд надорад. Сабабхои ин бисьёранд, мо онхоро дар лекцияи алохида муфассал дида мебароем. Дар дигар забонҳо, масалан, дар C++, ин баръакс аст. Бе мероси сершумор мушкorи ҷиддӣ ба миён меояд: як an object метавонад дорои як қатор хусусиятҳо ва "рафторҳо" бошад. Як мисол аз хаёт: барои падару модар мо фарзандем, барои муаллим мо студентем, барои духтур мо беморем. Дар зиндагӣ мо дар нақшҳои гуногун зоҳир мешавем ва мувофиқан, рафтори дигар мекунем: бешубҳа, мо бо муаллимон назар ба дӯстони наздик ба таври дигар сӯҳбат хоҳем кард. Биёед кӯшиш кунем, ки ин вазъиятро ба рамз тарҷума кунем. Биёед тасаввур кунем, ки мо ду синф дорем: Pond ва Aviary. Барои ҳавз ба шумо паррандагони шиноварӣ ва барои паррандапарварӣ паррандагон лозиманд. Барои ин, мо ду синфҳои асосӣ - FlyingBirdва Waterfowl.
public class Waterfowl {
}

public class FlyingBird {
}
Бинобар ин, мо ба паррандапарварӣ ҳамон паррандагонеро мефиристем FlyingBird, ки синфҳояшон аз Waterfowl. Ҳама чиз оддӣ ба назар мерасад. Аммо мо чӣ кор хоҳем кард, агар ба мо лозим ояд, ки мурғро дар ҷое муайян кунем? Вай ҳам шино мекунад ва ҳам парвоз мекунад. Аммо мо мероси сершумор надорем. Хушбахтона, Java якчанд татбиқи интерфейсҳоро таъмин мекунад. Агар синф аз якчанд волидайн мерос гирифта натавонад, татбиқи якчанд интерфейсҳо осон аст! Мурғобии мо метавонад ҳам парвоз кунад ва ҳам шино кунад :) Барои ба даст овардани натиҷаи дилхоҳ истифода бурдани интерфейсҳо, на дарсҳо FlyingBirdкифоя аст.Waterfowl
public class Duck implements FlyingBird, Waterfowl {

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

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

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
Ба шарофати ин, барномаи мо идоракунии фасеҳи синфро нигоҳ медорад ва дар якҷоягӣ бо татбиқи усулҳои пешфарз, қобorяти мо барои муайян кардани рафтори an objectҳо қариб беохир мегардад! :)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION