JavaRush /Блоги Java /Random-TG /Полиморфизм дар Java

Полиморфизм дар Java

Дар гурӯҳ нашр шудааст
Саволҳо дар бораи OOP қисми ҷудонашавандаи мусоҳибаи техникӣ барои вазифаи таҳиягари Java дар як ширкати IT мебошанд. Дар ин мақола мо дар бораи яке аз принсипҳои OOP - полиморфизм сӯҳбат хоҳем кард. Мо ба ҷанбаҳое, ки ҳангоми мусоҳиба аксар вақт пурсида мешаванд, тамаркуз мекунем ва инчунин барои возеҳият мисолҳои хурд меорем.

Полиморфизм чист?

Полиморфизм ин қобorяти як барнома барои истифода бурдани an objectҳои дорои интерфейси якхела аст, бидуни маълумот дар бораи намуди мушаххаси ин an object. Агар шумо ба саволи ин тавр ҷавоб диҳед, ки полиморфизм чист, эҳтимол аз шумо хоҳиш карда мешавад, ки чӣ маъно доред. Бори дигар, бидуни дархости як қатор саволҳои иловагӣ, ҳама чизро барои мусоҳиба ба тартиб дароред.

Полиморфизм дар Java дар мусоҳиба - 1
Мо метавонем аз он оғоз кунем, ки равиши OOP сохтани барномаи Java-ро дар асоси ҳамкории an objectҳои ба синфҳо асосёфта дар бар мегирад. Синфҳо расмҳои (шаблонҳои) қаблан навишташуда мебошанд, ки мувофиқи онҳо an objectҳои барнома сохта мешаванд. Гузашта аз ин, синф ҳамеша як навъи мушаххас дорад, ки бо услуби хуби барномасозӣ ҳадафи худро бо номи худ "мегӯяд". Илова бар ин, метавон қайд кард, ки азбаски Java забони сахт чопшуда аст, рамзи барнома ҳамеша бояд ҳангоми эълони тағирёбандаҳо намуди an objectро нишон диҳад. Ба ин илова кунед, ки чопкунии қатъӣ бехатарии code ва эътимоднокии барномаро афзоиш медиҳад ва ба шумо имкон медиҳад, ки хатогиҳои номувофиқии типро пешгирӣ кунед (масалан, кӯшиши тақсим кардани сатр ба адад) дар марҳилаи таҳия. Табиист, ки компилятор бояд навъи эълоншударо "донад" - ин метавонад як синф аз JDK ё синфе бошад, ки мо худамон офаридаем. Лутфан ба мусоҳиба таваҷҷӯҳ намоед, ки ҳангоми кор бо codeи барномавӣ мо метавонем на танҳо an objectҳоеро истифода барем, ки ҳангоми эъломия таъин кардаем, балки наслҳои онро низ истифода барем. Ин як нуқтаи муҳим аст: мо метавонем ба бисёр намудҳо муносибат кунем, ки гӯё онҳо танҳо як бошанд (то даме ки ин намудҳо аз як навъи асосӣ гирифта шудаанд). Ин инчунин маънои онро дорад, ки ҳангоми эълон кардани тағирёбандаи навъи суперкласс, мо метавонем ба он арзиши яке аз наслҳои онро таъин кунем. Агар шумо мисол оред, ба мусоҳиб писанд меояд. Якчанд an objectеро интихоб кунед, ки барои як гурӯҳи an objectҳо умумӣ (база) бошад ва аз он якчанд синфро мерос гиред. Синфи асосӣ:
public class Dancer {
    private String name;
    private int age;

    public Dancer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void dance() {
        System.out.println(toString() + "I dance like everyone else.");
    }

    @Override
    public String toString() {
        return "Я " + name + ", to me " + age + " years. " ;
    }
}
Дар наслҳо усули синфи асосиро бекор кунед:
public class ElectricBoogieDancer extends Dancer {
    public ElectricBoogieDancer(String name, int age) {
        super(name, age);
    }
// overriding the base class method
    @Override
    public void dance() {
        System.out.println( toString() + "I dance electric boogie!");
    }
}

public class BreakDankDancer extends Dancer{

    public BreakDankDancer(String name, int age) {
        super(name, age);
    }
// overriding the base class method
    @Override
    public void dance(){
        System.out.println(toString() + "I'm breakdancing!");
    }
}
Намунаи полиморфизм дар Java ва истифодаи an objectҳо дар барнома:
public class Main {

    public static void main(String[] args) {
        Dancer dancer = new Dancer("Anton", 18);

        Dancer breakDanceDancer = new BreakDankDancer("Alexei", 19);// upcast to base type
        Dancer electricBoogieDancer = new ElectricBoogieDancer("Igor", 20); // upcast to base type

        List<Dancer> discotheque = Arrays.asList(dancer, breakDanceDancer, electricBoogieDancer);
        for (Dancer d : discotheque) {
            d.dance();// polymorphic method call
        }
    }
}
Дар codeи метод mainнишон диҳед , ки чӣ дар сатрҳо мавҷуд аст:
Dancer breakDanceDancer = new BreakDankDancer("Alexei", 19);
Dancer electricBoogieDancer = new ElectricBoogieDancer("Igor", 20);
Мо як тағирёбандаи навъи суперкласс эълон кардем ва ба он арзиши яке аз наслҳоро таъин кардем. Эҳтимол, аз шумо мепурсанд, ки чаро компилятор дар бораи номутобиқатии байни навъҳои дар чап ва рости аломати таъиншуда шикоят намекунад, зеро Java чопкунии сахт дорад. Фаҳмонед, ки табдor навъи боло дар ин ҷо кор мекунад - истинод ба an object ҳамчун истинод ба синфи асосӣ шарҳ дода мешавад. Гузашта аз ин, компилятор бо чунин сохтмон дар code дучор омада, ин корро ба таври худкор ва ғайримустақим анҷом медиҳад. Дар асоси codeи мисол метавон нишон дод, ки навъи синфе, ки дар тарафи чапи аломати таъинот эълон шудааст, дорои Dancerякчанд шакл (намудҳо) дар тарафи рост эълон шудааст BreakDankDancer. ElectricBoogieDancerҲар як шакл метавонад рафтори беназири худро барои функсияҳои умумӣ дошта бошад, ки дар усули суперкласс муайян карда шудааст dance. Яъне, усули дар суперкласс эълоншуда метавонад дар наслҳои он ба таври гуногун амалӣ карда шавад. Дар ин ҳолат, мо бо бартарии усулҳо сарукор дорем ва маҳз ҳамин чиз шаклҳои гуногунро (рафторҳоро) ба вуҷуд меорад. Шумо метавонед инро тавассути иҷро кардани рамзи усули асосӣ барои иҷро дидан мумкин аст: Натиҷаи барнома Ман Антон ҳастам, ман 18 сола ҳастам. Ман мисли дигарон рақс мекунам. Ман Алексей, ман 19-солаам. Ман брейк данс мекунам! Ман Игор, ман 20-солаам. Ман буги электрикиро рақс мекунам! Агар мо дар наслҳо бартариятро истифода накунем, пас мо рафтори гуногунро ба даст намеорем. BreakDankDancerМасалан, агар мо ElectricBoogieDancerусули дарсҳои худро шарҳ диҳем dance, натиҷаи барнома чунин хоҳад буд: Ман Антон, ман 18-солаам. Ман мисли дигарон рақс мекунам. Ман Алексей, ман 19-солаам. Ман мисли дигарон рақс мекунам. Ман Игор, ман 20-солаам. Ман мисли дигарон рақс мекунам. BreakDankDancerВа ин маънои онро дорад, ки эҷоди синфҳои нав ҳеҷ маъно надорад ElectricBoogieDancer. Принсипи полиморфизми Java маҳз чист? Истифодаи an object дар барнома бидуни надонистани навъи мушаххаси он дар куҷо пинҳон аст? Дар мисоли мо, ин даъвати методӣ d.dance()ба an objectи dнавъи Dancer. Полиморфизми Java маънои онро дорад, ки барнома набояд донад, ки an object BreakDankDancerё an object чӣ гуна хоҳад буд ElectricBoogieDancer. Чизи асосй он аст, ки он насли синф аст Dancer. Ва агар дар бораи наслҳо сухан ронем, бояд қайд кард, ки мерос дар Java на танҳо extends, балки implements. Ҳоло вақти он расидааст, ки Java мероси сершуморро дастгирӣ намекунад - ҳар як намуд метавонад як волидайн (суперсинф) ва шумораи номаҳдуди наслҳо (зерсинфҳо) дошта бошад. Аз ин рӯ, интерфейсҳо барои илова кардани функсияҳои сершумор ба синфҳо истифода мешаванд. Интерфейсҳо пайвастшавии an objectҳоро ба волидайн дар муқоиса бо мерос коҳиш медиҳанд ва хеле васеъ истифода мешаванд. Дар Java, интерфейс як навъи истинод аст, бинобар ин, барнома метавонад навъи онро тағирёбандаи навъи интерфейс эълон кунад. Ин вақти хубест барои мисол овардан. Биёед интерфейсро эҷод кунем:
public interface Swim {
    void swim();
}
Барои равшанӣ, биёед an objectҳои гуногун ва ба ҳам алоқамандро гирем ва интерфейсро дар онҳо татбиқ кунем:
public class Human implements Swim {
    private String name;
    private int age;

    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public void swim() {
        System.out.println(toString()+"I swim with an inflatable ring.");
    }

    @Override
    public String toString() {
        return "Я " + name + ", to me " + age + " years. ";
    }

}

public class Fish implements Swim{
    private String name;

    public Fish(String name) {
        this.name = name;
    }

    @Override
    public void swim() {
        System.out.println("I'm a fish " + name + ". I swim by moving my fins.");

    }

public class UBoat implements Swim {

    private int speed;

    public UBoat(int speed) {
        this.speed = speed;
    }

    @Override
    public void swim() {
        System.out.println("The submarine is sailing, rotating the propellers, at a speed" + speed + " knots.");
    }
}
Усул main:
public class Main {

    public static void main(String[] args) {
        Swim human = new Human("Anton", 6);
        Swim fish = new Fish("whale");
        Swim boat = new UBoat(25);

        List<Swim> swimmers = Arrays.asList(human, fish, boat);
        for (Swim s : swimmers) {
            s.swim();
        }
    }
}
Натиҷаи иҷрои усули полиморфӣ, ки дар интерфейс муайян шудааст, ба мо имкон медиҳад, ки фарқияти рафтори намудҳоеро, ки ин интерфейсро амалӣ мекунанд, бубинем. Онҳо аз натиҷаҳои гуногуни иҷрои усул иборатанд swim. Пас аз омӯхтани мисоли мо, мусоҳиба метавонад пурсад, ки чаро ҳангоми иҷро кардани code азmain
for (Swim s : swimmers) {
            s.swim();
}
Оё усулҳои дар ин синфҳо муайяншуда барои an objectҳои мо даъват карда мешаванд? Ҳангоми иҷрои барнома татбиқи дилхоҳи усулро чӣ гуна интихоб кардан мумкин аст? Барои ҷавоб додан ба ин саволҳо, мо бояд дар бораи бастани дер (динамикӣ) сӯҳбат кунем. Бо ҳатмӣ мо дар назар дорем, ки робита байни даъвати метод ва татбиқи мушаххаси он дар синфҳо муқаррар карда шавад. Аслан, code муайян мекунад, ки кадоме аз се усули дар синфҳо муайяншуда иҷро карда мешавад. Java ба таври нобаёнӣ ҳатмии дерро истифода мебарад (на дар вақти иҷро, на дар вақти тартибдиҳӣ, чунон ки дар мавриди ҳатмии барвақт). Ин маънои онро дорад, ки ҳангоми тартиб додани code
for (Swim s : swimmers) {
            s.swim();
}
Компилятор ҳанӯз намедонад, ки code аз кадом синф аст Humanва Fishё Uboatон дар swim. Ин танҳо вақте муайян карда мешавад, ки барнома ба туфайли механизми интиқоли динамикӣ - тафтиши намуди an object ҳангоми иҷрои барнома ва интихоби татбиқи дилхоҳи усул барои ин намуд иҷро карда мешавад. Агар аз шумо пурсанд, ки ин чӣ гуна иҷро мешавад, шумо метавонед ҷавоб диҳед, ки ҳангоми бор кардан ва ба кор андохтани an objectҳо, JVM дар хотира ҷадвалҳо месозад ва дар онҳо тағирёбандаҳоро бо арзишҳо ва an objectҳоро бо усулҳои худ алоқаманд мекунад. Ғайр аз он, агар an object мерос гирифта шавад ё интерфейсро амалӣ созад, аввал мавҷудияти усулҳои бекоршуда дар синфи он тафтиш карда мешавад. Агар вуҷуд дошта бошанд, онҳо ба ин намуд алоқаманданд, агар не, усуле ҷустуҷӯ карда мешавад, ки дар синф як зина болотар (дар волидайн) ва ғайра то реша дар иерархияи бисёрсатҳа муайян карда мешавад. Дар бораи полиморфизм дар OOP ва татбиқи он дар codeи барнома сухан ронда, мо қайд мекунем, ки истифодаи тавсифи абстрактӣ барои муайян кардани синфҳои асосӣ бо истифода аз синфҳои абстрактӣ ва инчунин интерфейсҳо таҷрибаи хуб аст. Ин амалия ба истифодаи абстраксия асос ёфтааст - ҷудо кардани рафтор ва хосиятҳои умумӣ ва иҳота кардани онҳо дар дохor синфи абстрактӣ ё ҷудо кардани танҳо рафтори умумӣ - дар ин ҳолат мо интерфейс эҷод мекунем. Сохтан ва тарҳрезии иерархияи an objectҳо дар асоси интерфейсҳо ва мероси синфӣ шарти ҳатмӣ барои иҷрои принсипи полиморфизми OOP мебошад. Вобаста ба масъалаи полиморфизм ва навовариҳо дар Java, мо метавонем қайд кунем, ки ҳангоми сохтани синфҳо ва интерфейсҳои абстрактӣ аз Java 8 сар карда, бо истифода аз калимаи калидӣ татбиқи пешфарзи усулҳои абстрактиро дар синфҳои базавӣ навиштан мумкин аст default. Барои намуна:
public interface Swim {
    default void swim() {
        System.out.println("Just floating");
    }
}
Баъзан онҳо метавонанд дар бораи талаботҳои эъломияи усулҳо дар синфҳои асосӣ пурсанд, то принсипи полиморфизм вайрон нашавад. Дар ин ҷо ҳама чиз оддӣ аст: ин усулҳо набояд статикӣ , хусусӣ ва ниҳоӣ бошанд . Private усулро танҳо дар синф дастрас мекунад ва шумо онро дар насл бекор карда наметавонед. Static методро моликияти синф месозад, на an object, аз ин рӯ усули суперкласс ҳамеша даъват карда мешавад. Ниҳоӣ усулро тағирнопазир ва аз ворисонаш пинҳон мекунад.

Полиморфизм ба мо дар Java чӣ медиҳад?

Саволе, ки истифодаи полиморфизм ба мо чӣ медиҳад, эҳтимолан ба миён меояд. Дар ин ҷо шумо метавонед ба таври мухтасар, бидуни чуқуртар ба алафҳои бегона ҷавоб диҳед:
  1. Ба шумо имкон медиҳад, ки татбиқи an objectҳоро иваз кунед. Ин аст, ки санҷиш ба он асос ёфтааст.
  2. Тавсеаи барномаро таъмин мекунад - эҷод кардани замина барои оянда хеле осонтар мешавад. Илова кардани навъҳои нав дар асоси намудҳои мавҷуда роҳи маъмултарини васеъ кардани функсияҳои барномаҳое мебошад, ки бо услуби OOP навишта шудаанд.
  3. Ба шумо имкон медиҳад, ки an objectҳоро бо намуд ё рафтори умумӣ дар як коллексия ё массив муттаҳид кунед ва онҳоро ба таври яксон идора кунед (чунон ки дар мисолҳои мо, ҳамаро рақс мекунанд - усул danceё шиноварӣ - усул swim).
  4. Тасвирӣ ҳангоми эҷоди навъҳои нав: шумо метавонед усули аз ҷониби волидайн татбиқшударо интихоб кунед ё онро дар кӯдак бекор кунед.

Калимаҳои ҷудошуда барои сафар

Принсипи полиморфизм мавзӯи хеле муҳим ва васеъ аст. Он тақрибан нисфи OOP-и Java ва як қисми хуби асосҳои забонро дар бар мегирад. Шумо наметавонед аз муайян кардани ин принсип дар мусоҳиба халос шавед. Надонистан ё нафаҳмидани он ба эҳтимоли зиёд ба мусоҳиба хотима мегузорад. Аз ин рӯ, танбал нашавед, ки дониши худро пеш аз санҷиш санҷед ва агар лозим бошад, онро нав кунед.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION