Niyə interfeyslər lazımdır? İnterfeys varisliyi niyə lazımdır? Polimorfizm nə üçün lazımdır? İnterfeys mirasının necə ediləcəyini oxuyan və başa düşən, lakin niyə olduğunu başa düşməyənlər üçün. Keçən dəfə adi İvanovlar ailəsinin nümunəsindən istifadə edərək, interfeyslərin nə üçün lazım olduğuna baxdıq. Problemli ailəni rəqəmsallaşdırmağa davam edirik. Hər bir insanın heç kimdən miras almadığı və ya heç kimə ötürmədiyi bəzi vərdişləri var - şəxsi vərdişləri. Bizim vəzifəmiz hər bir ailə üzvünə unikal vərdişlər bəxş etməkdir. Java müstəvisinə keçək: yalnız bu siniflərə aid olacaq siniflərdə unikal metodlar tətbiq etməliyik. Yaxşı, davam et! Bu Petyadır:
class Петя implements ПривычкиПапы, ПривычкиМамы {
//это личные Петины привычки
public void ковырятьВНосу () {
System.out.println("Ковырь-ковырь");
}
//это унаследованные привычки
@Override
public void прихлюпывать() {
System.out.println("Хлюп");
}
@Override
public void поджимать () {
System.out.println("Поджать губки");
}
}
Bu atadır:
class Папа implements ПривычкиПапы {
//это личные Папины привычки
public void чесатьБороду () {
System.out.println("Чешу бороду");
}
//это переданные привычки
@Override
public void прихлюпывать() {
System.out.println("Хлюп");
}
}
Bu Anadır:
class Мама implements ПривычкиМамы{
//это личные Мамины привычки
public void хлопатьРесницами () {
System.out.println("Хлоп-хлоп");
}
//это переданные привычки
@Override
public void поджимать() {
System.out.println("Поджать губки");
}
}
Mükəmməl! Hər şey lazım olduğu kimi işləyir! Birinci yazıda proqramın real dünyanın əksi olduğu bildirilib. Gerçəkliyin ən maraqlı xüsusiyyəti onun hər an dəyişməsidir. İvanovlar ailəsi də istisna deyildi, onların Maşa adlı şirin bir qızı var idi. Kirpiklərini döymə vərdişini isə atadan miras aldı. Proqramımızda dəyişiklik etməliyik. Buyurun, o qədər də çətin deyil, əsas məntiqli düşünməkdir. Axı, hər kəs interfeyslərin nə üçün lazım olduğunu bilir. İndi Maşanın vərdişləri interfeysini yaradaq , orada clapElashes() və squish() metodunu təsvir edək , onu Maşaya tətbiq edək və işimiz bitdi. Bəs eyni adlı metodlar artıq digər interfeyslərdə tətbiq olunursa, siz bunu bir dəfə edə bilərsiniz. Həqiqətən, kim bilir İvanovlar ailəsinin hansı planları var, əgər Seryoja doğulsa, kim atadan, anadan, ulu babadan və dördüncü nəsildən başqasından vərdişləri miras alacaq , hər dəfə bir interfeys yaradacaq, məsələn: interfeys Seryozha'nın vərdişləri , və orada digər interfeyslərdə artıq yüzlərlə dəfə elan edilə bilən metodları elan edirmi? Bir neçə və ya üç nəsildə biz digər interfeyslərdə təsvir edilmiş bir çox eyni üsullarla interfeys əldə etmək riski ilə üzləşirik və əgər bəzi vərdişlərin adını dəyişdirmək lazımdırsa (və bu olduqca mümkündür - axırda dünya dəyişir) , onda bu spagettini necə anlamaq olar, mən təsəvvür edə bilmirəm. Oturub möcüzə xəyal etmək qalır. İndi hər bir vərdişin öz interfeysi olsaydı. Təsəvvür edək:
public interface ПривычкаПрихлюпывать {
public void прихлюпывать();
}
public interface ПривычкаПоджимать {
public void поджимать();
}
public interface ПривычкаКовырятьВНосу {
public void ковырятьВНосу();
}
public interface ПривычкаХлопатьРесницами {
public void хлопатьРесницами();
}
public interface ПривычкаЧесатьБороду {
public void чесатьБороду();
}
Və sonra, Lego-da olduğu kimi, fərdi vərdişlərdən çoxlu mirasdan istifadə edərək, ailənin fərdi üzvünün vərdişləri üçün lazım olan interfeysi yaza bilərik. Bu kimi bir şey:
public interface ПривычкиМамы extends ПривычкаПоджимать, ПривычкаХлопатьРесницами {
}
public interface ПривычкиПапы extends ПривычкаЧесатьБороду, ПривычкаХлюпать {
}
public interface ПривычкиПети extends ПривычкаПоджимать, ПривычкаХлюпать,ПривычкаКовырятьВНосу {
}
public interface ПривычкиМаши extends ПривычкаХлюпать, ПривычкаХлопатьРесницами {
}
Və sonra sadəcə istədiyiniz interfeysi istədiyiniz sinifə tətbiq edin, məsələn, Ana:
class Мама implements ПривычкиМамы{
@Override
public void хлопатьРесницами () {
System.out.println("Хлоп-хлоп");
}
@Override
public void поджимать() {
System.out.println("Поджать губки");
}
}
Eyni şeyi Papa, Petya və Maşa ilə də etmək olar . Və sonra, İvanovlar ailəsinin genişlənməsi ilə vərdişlərlə bağlı heç bir problem olmayacaqdı, biz onları salatdakı inqrediyentlər kimi interfeys səviyyəsində miras yolu ilə qarışdırardıq və eyni adlı bir dəstə üsul istehsal etməzdik. Eh, xəyallar, xəyallar... Çəkilən adam haqlıdır, bu, əslində mümkündür - indi İvanovlar ailəsinin simulyasiyası xilas oldu! Diqqətli oxucu sual verə bilər: "Niyə hər bir ailə üzvü üçün interfeyslər yaratmalısınız? Bizim bir sıra tədbirlərimiz var - onları tələb olunan sinif üçün dərhal həyata keçirin." Təsəvvür edək ki, bir çox paralel dünyalarda Petyanın cütləri var və bütün Petyalar Petyanın vərdişləri interfeysini həyata keçirməlidirlər.
interface ПривычкиПети extends ПривычкаПоджимать, ПривычкаХлюпать,ПривычкаКовырятьВНосу
class ПетяВселеннаяХ implements ПривычкиПети
class ПетяВселеннаяY implements ПривычкиПети
// и т.д.
Ümumi interfeys olmasaydı nə olardı?
class ПетяВселеннаяХ implements ПривычкаПоджимать, ПривычкаХлюпать,ПривычкаКовырятьВНосу
class ПетяВселеннаяY implements ПривычкаПоджимать, ПривычкаХлюпать,ПривычкаКовырятьВНосу
// и т.д.
Bu, daha çox təkrarlanan kodla nəticələnir. İnterfeys varisliyi tətbiqi dəyişdirmək üçün daha çevik edir, xüsusən də təkrarlanan üsullarla bağlı problemlər həll edilə bilər. Xahiş edirik bir daha qeyd edin ki, interfeyslərin çoxsaylı miras alınmasına icazə verilir.
GO TO FULL VERSION