JavaRush /Блоги Java /Random-TG /Тарҳрезии синфҳо ва интерфейсҳо (Тарҷумаи мақола)
fatesha
Сатҳи

Тарҳрезии синфҳо ва интерфейсҳо (Тарҷумаи мақола)

Дар гурӯҳ нашр шудааст
Тарҳрезии синфҳо ва интерфейсҳо (Тарҷумаи мақола) - 1

Мундариҷа

  1. Муқаддима
  2. Интерфейсҳо
  3. Нишондиҳандаҳои интерфейс
  4. Интерфейсҳои функсионалӣ, усулҳои статикӣ ва усулҳои пешфарз
  5. Синфҳои абстрактӣ
  6. Синфҳои тағирнашаванда (доими).
  7. Синфҳои беном
  8. Намоиш
  9. Мерос
  10. Мероси сершумор
  11. Мерос ва таркиб
  12. Инкапсуляция
  13. Дарсҳо ва усулҳои ниҳоӣ
  14. Баъд чӣ аст
  15. Рамзи сарчашмаро зеркашӣ кунед

1. МУҚАДДИМА

Новобаста аз он ки шумо кадом забони барномасозиро истифода мебаред (ва Java истисно нест), риояи принсипҳои хуби тарроҳӣ калиди навиштани рамзи тоза, фаҳмо ва тасдиқшаванда мебошад; ва инчунин онро барои дарозумрӣ эҷод кунед ва ҳалли мушкилотро ба осонӣ дастгирӣ кунед. Дар ин қисми дарс, мо мехоҳем блокҳои бунёдии бунёдиро, ки забони Java пешниҳод мекунад, муҳокима кунем ва якчанд принсипҳои тарроҳиро ҷорӣ кунем, то ба шумо дар қабули қарорҳои тарҳрезии беҳтар кӯмак расонанд. Аниқтараш, мо интерфейсҳо ва интерфейсҳоро бо истифода аз усулҳои пешфарз (хусусияти нав дар Java 8), синфҳои абстрактӣ ва ниҳоӣ, синфҳои тағирнашаванда, мерос, таркиб муҳокима хоҳем кард ва қоидаҳои намоёнро (ё дастрасиро), ки мо ба таври мухтасар дар ин бора баррасӣ кардем, баррасӣ хоҳем кард. Қисми 1 дарси "Чӣ тавр сохтан ва нобуд кардани an objectҳо" .

2. ИНТЕРФЕЙСҲО

Дар барномасозии ба an object нигаронидашуда консепсияи интерфейсҳо асоси таҳияи шартномаҳоро ташкил медиҳад . Хулоса, интерфейсҳо маҷмӯи усулҳоро (шартномаҳоро) муайян мекунанд ва ҳар як синфе, ки дастгирии ин интерфейси мушаххасро талаб мекунад, бояд татбиқи ин усулҳоро таъмин кунад: идеяи хеле содда, вале пурқувват. Бисёр забонҳои барномасозӣ дар ин ё он шакл интерфейс доранд, аммо махсусан Java барои ин дастгирии забонро таъмин мекунад. Биёед таърифи оддии интерфейсро дар Java дида бароем.
package com.javacodegeeks.advanced.design;

public interface SimpleInterface {
void performAction();
}
Дар порчаи боло, интерфейсе, ки мо даъват кардем SimpleInterface, танҳо як усулро эълон мекунад performAction. Фарқи асосии байни интерфейсҳо ва синфҳо дар он аст, ки интерфейсҳо нишон медиҳанд, ки алоқа чӣ гуна бошад (онҳо усулро эълон мекунанд), аммо татбиқи онҳоро таъмин намекунанд. Аммо, интерфейсҳо дар Java метавонанд мураккабтар бошанд: онҳо метавонанд интерфейсҳои дохилӣ, синфҳо, ҳисобҳо, эзоҳҳо ва доимиро дар бар гиранд. Барои намуна:
package com.javacodegeeks.advanced.design;

public interface InterfaceWithDefinitions {
    String CONSTANT = "CONSTANT";

    enum InnerEnum {
        E1, E2;
    }

    class InnerClass {
    }

    interface InnerInterface {
        void performInnerAction();
    }

    void performAction();
}
Дар ин мисоли мураккабтар якчанд маҳдудиятҳо мавҷуданд, ки интерфейсҳо бечунучаро ба сохторҳои лона ва эъломияҳои усул мегузоранд ва онҳо аз ҷониби компилятори Java амалӣ карда мешаванд. Пеш аз ҳама, ҳатто агар ба таври возеҳ эълон нашуда бошад ҳам, ҳар як эъломияи усул дар интерфейс оммавӣ аст (ва танҳо метавонад оммавӣ бошад). Ҳамин тариқ, эъломияҳои усулҳои зерин баробаранд:
public void performAction();
void performAction();
Қобor зикр аст, ки ҳар як усули ягона дар интерфейс ба таври ғайримустақим абстракт эълон карда мешавад ва ҳатто ин эъломияҳои усулҳо баробаранд:
public abstract void performAction();
public void performAction();
void performAction();
Дар мавриди майдонҳои доимии эълоншуда, ба ғайр аз оммавӣ будан , онҳо инчунин ба таври ғайримустақим статикӣ ва ниҳоӣ қайд карда мешаванд . Аз ин рӯ, эъломияҳои зерин низ баробаранд:
String CONSTANT = "CONSTANT";
public static final String CONSTANT = "CONSTANT";
Ниҳоят, синфҳо, интерфейсҳо ё ҳисобҳои лона гузошташуда ба ғайр аз оммавӣ будан , инчунин ба таври ғайримустақим статикӣ эълон карда мешаванд . Масалан, ин эъломияҳо инчунин ба:
class InnerClass {
}

static class InnerClass {
}
Услубе, ки шумо интихоб мекунед, афзалияти шахсӣ аст, аммо донистани ин хосиятҳои оддии интерфейсҳо метавонад шуморо аз чопкунии нолозим наҷот диҳад.

3. Нишондиҳандаи интерфейс

Интерфейси маркер як намуди махсуси интерфейсест, ки усулҳо ё дигар сохторҳои лона надорад. Чӣ тавр китобхонаи Java онро муайян мекунад:
public interface Cloneable {
}
Нишондиҳандаҳои интерфейси худ шартнома нестанд, балки як усули то ҳадде муфид барои "пайваст кардан" ё "пайваст кардани" баъзе хислатҳои мушаххас бо синф мебошанд. Масалан, нисбат ба Cloneable , синф ҳамчун клоншаванда қайд карда мешавад, аммо роҳе, ки онро метавон иҷро кард ё бояд иҷро кард, ҷузъи интерфейс нест. Боз як мисоли хеле машҳур ва васеъ истифодашавандаи аломати интерфейс ин аст Serializable:
public interface Serializable {
}
Ин интерфейс синфро барои сериализатсия ва бесериализатсия мувофиқ нишон медиҳад ва боз ҳам мушаххас намекунад, ки ин чӣ гуна метавонад ё чӣ гуна амалӣ карда шавад. Нишондиҳандаҳои интерфейс дар барномасозии ба an object нигаронидашуда ҷои худро доранд, гарчанде ки онҳо ҳадафи асосии интерфейси шартнома буданро қонеъ намекунанд. 

4. ИНТЕРФЕЙСҲОИ ФУНКСИОНАЛӢ, УСУЛҲОИ ТОҶИКИСТОНӢ ВА УСУЛҲОИ СТАТИКӢ

Аз замони нашри Java 8, интерфейсҳо якчанд хусусиятҳои нави хеле ҷолиб пайдо карданд: усулҳои статикӣ, усулҳои пешфарз ва табдor автоматӣ аз ламбдаҳо (интерфейсҳои функсионалӣ). Дар бахши интерфейсҳо, мо таъкид кардем, ки интерфейсҳо дар Java танҳо усулҳоро эълон карда метавонанд, аммо татбиқи онҳоро таъмин намекунанд. Бо усули пешфарз, чизҳо гуногунанд: интерфейс метавонад усулро бо калимаи пешфарз қайд кунад ва татбиқи онро таъмин кунад. Барои намуна:
package com.javacodegeeks.advanced.design;

public interface InterfaceWithDefaultMethods {
    void performAction();

    default void performDefaulAction() {
        // Implementation here
    }
}
Дар сатҳи мисол, усулҳои пешфарз метавонанд тавассути ҳар як амалисозии интерфейс бекор карда шаванд, аммо интерфейсҳо акнун метавонанд усулҳои статикиро дар бар гиранд , масалан: package com.javacodegeeks.advanced.design;
public interface InterfaceWithDefaultMethods {
    static void createAction() {
        // Implementation here
    }
}
Гуфтан мумкин аст, ки таъмини татбиқ дар интерфейс тамоми ҳадафи барномасозии шартномаро барбод медиҳад. Аммо сабабҳои зиёде мавҷуданд, ки чаро ин хусусиятҳо ба забони Java ворид карда шудаанд ва новобаста аз он ки онҳо то чӣ андоза муфид ё печида бошанд ҳам, онҳо барои шумо ва истифодаи шумо ҳастанд. Интерфейсҳои функсионалӣ як ҳикояи дигаранд ва исбот кардаанд, ки иловаҳои хеле муфид ба забон мебошанд. Асосан, интерфейси функсионалӣ интерфейсест, ки танҳо як усули абстрактӣ дар он эълон шудааст. RunnableИнтерфейси стандартии китобхона намунаи хеле хуби ин консепсия мебошад.
@FunctionalInterface
public interface Runnable {
    void run();
}
Компилятори Java ба интерфейсҳои функсионалӣ ба таври дигар муносибат мекунад ва метавонад функсияи лямбдаро ба татбиқи интерфейси функсионалӣ табдил диҳад, ки дар он ҷо маъно дорад. Биёед тавсифи функсияи зеринро баррасӣ кунем: 
public void runMe( final Runnable r ) {
    r.run();
}
Барои даъват кардани ин функсия дар Java 7 ва поёнтар, татбиқи интерфейс бояд таъмин карда шавад Runnable(масалан, бо истифода аз синфҳои беном), аммо дар Java 8 таъмин намудани татбиқи усули run() бо истифода аз синтаксиси lambda кифоя аст:
runMe( () -> System.out.println( "Run!" ) );
Илова бар ин, тавзеҳи @FunctionalInterface (эзоҳҳо дар Қисми 5-и дастур ба таври муфассал баррасӣ карда мешаванд) ишора мекунад, ки компилятор метавонад тафтиш кунад, ки оё интерфейс танҳо як усули абстрактӣ дорад, аз ин рӯ ҳама гуна тағирот дар оянда дар интерфейс ин фарзияро вайрон намекунад. .

5. ДАРСХОИ РЕФЕРАТТ

Консепсияи дигари ҷолибе, ки аз ҷониби забони Java дастгирӣ мешавад, консепсияи синфҳои абстрактӣ мебошад. Синфҳои абстрактӣ то андозае ба интерфейсҳои Java 7 монанданд ва ба интерфейси усули пешфарз дар Java 8 хеле наздиканд. Баръакси синфҳои муқаррарӣ, синфи абстрактиро эҷод кардан мумкин нест, аммо онро зерклассҳо кардан мумкин аст (барои тафсилоти бештар ба бахши Мерос муроҷиат кунед). Муҳимтар аз ҳама, синфҳои абстрактӣ метавонанд усулҳои абстрактӣ дошта бошанд: як намуди махсуси усул бидуни татбиқ, ба монанди интерфейс. Барои намуна:
package com.javacodegeeks.advanced.design;

public abstract class SimpleAbstractClass {
    public void performAction() {
        // Implementation here
    }

    public abstract void performAnotherAction();
}
Дар ин мисол, синф SimpleAbstractClassҳамчун абстракт эълон карда шудааст ва дорои як усули абстрактии эълоншуда мебошад. Синфҳои абстрактӣ хеле муфиданд; аксар ё ҳатто баъзе қисмҳои тафсилоти татбиқро дар байни бисёр зерсинфҳо мубодила кардан мумкин аст. Бо вуҷуди ин, онҳо то ҳол дарро кушода мегузоранд ва ба шумо имкон медиҳанд, ки рафтори ба ҳар як зерсинфҳо хосро бо усулҳои абстрактӣ танзим кунед. Қобor зикр аст, ки бар хилофи интерфейсҳое, ки метавонанд танҳо эъломияҳои оммавиро дар бар гиранд , синфҳои абстрактӣ метавонанд қудрати пурраи қоидаҳои дастрасиро барои назорат кардани аёнияти усули абстрактӣ истифода баранд.

6. СИНФХОИ ФАВРИЛ

Тағирнопазирӣ дар таҳияи нармафзор имрӯзҳо аҳамияти бештар пайдо мекунад. Афзоиши системаҳои бисёраслӣ мушкилоти зиёдеро ба мубодилаи маълумот ва параллелизм ба миён овард. Аммо як мушкилот бешубҳа ба миён омад: доштани ҳолати каме (ё ҳатто тамоман) тағирёбанда боиси васеъшавӣ (миқёспазирӣ) ва мулоҳизаҳои осонтар дар бораи система мегардад. Мутаассифона, забони Java барои тағирнопазирии синф дастгирии муносиб намедиҳад. Бо вуҷуди ин, бо истифода аз маҷмӯи усулҳо, тарҳрезии синфҳои тағирнопазир имконпазир мегардад. Пеш аз ҳама, ҳама соҳаҳои синф бояд ниҳоӣ бошанд (ҳамчун ниҳоӣ қайд карда мешаванд ). Ин оғози хуб аст, аммо ҳеҷ гуна кафолат вуҷуд надорад. 
package com.javacodegeeks.advanced.design;

import java.util.Collection;

public class ImmutableClass {
    private final long id;
    private final String[] arrayOfStrings;
    private final Collection<String> collectionOfString;
}
Дуюм, ибтидосозии дурустро таъмин кунед: агар майдон истинод ба коллексия ё массив бошад, он майдонҳоро мустақиман аз аргументҳои созанда таъин накунед, ба ҷои он нусхабардорӣ кунед. Ин кафолат медиҳад, ки ҳолати коллексия ё массив берун аз он тағир дода нашавад.
public ImmutableClass( final long id, final String[] arrayOfStrings,
        final Collection<String> collectionOfString) {
    this.id = id;
    this.arrayOfStrings = Arrays.copyOf( arrayOfStrings, arrayOfStrings.length );
    this.collectionOfString = new ArrayList<>( collectionOfString );
}
Ва ниҳоят, таъмини дастрасии дуруст (гирандагон). Барои коллексияҳо, тағирнопазирӣ бояд ҳамчун сарпӯш таъмин карда шавад  Collections.unmodifiableXxx: Бо массивҳо, ягона роҳи таъмини тағирнопазирии ҳақиқӣ ин пешниҳод кардани нусха ба ҷои баргардонидани истинод ба массив мебошад. Ин метавонад аз нуқтаи назари амалӣ қобor қабул набошад, зеро он аз андозаи массив хеле вобаста аст ва метавонад ба коллекторҳои партов фишори зиёд расонад.
public String[] getArrayOfStrings() {
    return Arrays.copyOf( arrayOfStrings, arrayOfStrings.length );
}
Ҳатто ин мисоли хурд тасаввуроти хуб медиҳад, ки тағирнопазирӣ ҳанӯз шаҳрванди дараҷаи аввал дар Java нест. Агар синфи тағирнашаванда майдоне дошта бошад, ки ба an objectи синфи дигар дахл дорад, корҳо душвор шуда метавонанд. Он синфҳо низ бояд тағирнопазир бошанд, аммо ҳеҷ роҳе барои таъмини ин вуҷуд надорад. Якчанд анализаторҳои хуби codeи сарчашмаҳои Java мавҷуданд, ба монанди FindBugs ва PMD, ки метавонанд тавассути тафтиши codeи шумо ва нишон додани камбудиҳои маъмулии барномасозии Java кӯмаки калон расонанд. Ин воситаҳо дӯстони бузурги ҳар як таҳиягари Java мебошанд.

7. СИНФХОИ АНОНИМ

Дар давраи пеш аз Java 8, синфҳои беном ягона роҳе буданд, ки синфҳо зуд муайян карда шаванд ва фавран таъсис дода шаванд. Мақсади синфҳои беном ин кам кардани қаҳвахонаҳо ва пешниҳоди роҳи кӯтоҳ ва осон барои муаррифии синфҳо ҳамчун сабт буд. Биёед ба тарзи маъмулии кӯҳна барои тавлиди риштаи нав дар Java назар андозем:
package com.javacodegeeks.advanced.design;

public class AnonymousClass {
    public static void main( String[] args ) {
        new Thread(
            // Example of creating anonymous class which implements
            // Runnable interface
            new Runnable() {
                @Override
                public void run() {
                    // Implementation here
                }
            }
        ).start();
    }
}
Дар ин мисол, татбиқи Runnableинтерфейс фавран ҳамчун синфи номаълум таъмин карда мешавад. Гарчанде ки баъзе маҳдудиятҳои марбут ба синфҳои беном вуҷуд доранд, камбудиҳои асосии истифодаи онҳо ин синтаксиси сохтории хеле муфассал аст, ки Java ҳамчун забон ӯҳдадор аст. Ҳатто як синфи беном, ки ҳеҷ кор намекунад, ҳар дафъа навиштан ҳадди аққал 5 сатри codeро талаб мекунад.
new Runnable() {
   @Override
   public void run() {
   }
}
Хушбахтона, бо Java 8, lambda ва интерфейсҳои функсионалӣ, ҳамаи ин стереотипҳо ба зудӣ аз байн хоҳанд рафт ва дар ниҳоят навиштани рамзи Java воқеан мухтасар хоҳад буд.
package com.javacodegeeks.advanced.design;

public class AnonymousClass {
    public static void main( String[] args ) {
        new Thread( () -> { /* Implementation here */ } ).start();
    }
}

8. НАМОИШ

Мо аллакай каме дар бораи қоидаҳои аёният ва дастрасӣ дар Java дар қисми 1 дарсӣ сӯҳбат кардем. Дар ин қисм, мо ин мавзӯъро дубора баррасӣ хоҳем кард, аммо дар заминаи зерклассҳо. Тарҳрезии синфҳо ва интерфейсҳо (Тарҷумаи мақола) - 2Намоиш дар сатҳҳои гуногун ба синфҳо имкон медиҳад ё монеъ мешавад, ки синфҳо ё интерфейсҳои дигар (масалан, агар онҳо дар бастаҳои гуногун бошанд ё дар дохor ҳамдигар ҷойгир бошанд) ё зерсинфҳо дидан ва дастрасӣ ба усулҳо, созандагон ва майдонҳои волидайни худро бинанд. Дар фасли оянда, мерос, мо инро дар амал мебинем.

9. МЕРОС

Мерос яке аз мафҳумҳои асосии барномасозии ба an object нигаронидашуда буда, ҳамчун асос барои сохтани синфи муносибатҳо хизмат мекунад. Дар якҷоягӣ бо қоидаҳои аёният ва дастрасӣ, мерос имкон медиҳад, ки синфҳо ба иерархия тарҳрезӣ шаванд, ки онро васеъ кардан ва нигоҳ доштан мумкин аст. Дар сатҳи консептуалӣ, мерос дар Java бо истифода аз зерклассҳо ва калимаи калидии extensions дар якҷоягӣ бо синфи волидайн амалӣ карда мешавад. Зерсинф ҳама унсурҳои ҷамъиятӣ ва муҳофизатшудаи синфи волидайнро мерос мегирад. Илова бар ин, зерсинф унсурҳои бастаи хусусии синфи волидайни худро мерос мегирад, агар ҳарду (зерсинф ва синф) дар як баста бошанд. Ин хеле муҳим аст, новобаста аз он ки шумо чӣ гуна тарҳрезӣ кардан мехоҳед, риоя кардани ҳадди ақали усулҳое, ки синф ба таври оммавӣ ё зерсинфҳои он фош мекунад, хеле муҳим аст. Масалан, биёед ба синф Parentва зерсинфи он назар андозем Child, то фарқияти сатҳи намоён ва таъсири онҳоро нишон диҳем.
package com.javacodegeeks.advanced.design;

public class Parent {
    // Everyone can see it
    public static final String CONSTANT = "Constant";

    // No one can access it
    private String privateField;
    // Only subclasses can access it
    protected String protectedField;

    // No one can see it
    private class PrivateClass {
    }

    // Only visible to subclasses
    protected interface ProtectedInterface {
    }

    // Everyone can call it
    public void publicAction() {
    }

    // Only subclass can call it
    protected void protectedAction() {
    }

    // No one can call it
    private void privateAction() {
    }

    // Only subclasses in the same package can call it
    void packageAction() {
    }
}
package com.javacodegeeks.advanced.design;

// Resides in the same package as parent class
public class Child extends Parent implements Parent.ProtectedInterface {
    @Override
    protected void protectedAction() {
        // Calls parent's method implementation
        super.protectedAction();
    }

    @Override
    void packageAction() {
        // Do nothing, no call to parent's method implementation
    }

    public void childAction() {
        this.protectedField = "value";
    }
}
Мерос як мавзӯи хеле калонест, ки дорои тафсилоти зиёди мушаххаси Java мебошад. Бо вуҷуди ин, якчанд қоидаҳое мавҷуданд, ки риоя кардан осон аст ва метавонанд дар нигоҳ доштани кӯтоҳии иерархияи синф роҳи дарозеро тай кунанд. Дар Java, ҳар як зеркласс метавонад ҳама гуна усулҳои мероси волидайни худро бекор кунад, агар он ниҳоӣ эълон нашуда бошад. Аммо, ягон синтаксиси махсус ё калимаи калидӣ вуҷуд надорад, ки усулро ҳамчун бекоршуда қайд кунад, ки метавонад ба иштибоҳ оварда расонад. Аз ин рӯ, шарҳи @Override ҷорӣ карда шуд : ҳар вақте ки ҳадафи шумо бекор кардани усули меросӣ аст, лутфан шарҳи @Override -ро истифода баред , то онро мухтасар нишон диҳед. Мушкилоти дигаре, ки таҳиягарони Java ҳамеша дар тарҳрезӣ дучор мешаванд, ин сохтани иерархияи синфҳо (бо синфҳои мушаххас ё абстрактӣ) дар муқоиса бо татбиқи интерфейсҳо мебошад. Мо ба таври қатъӣ тавсия медиҳем, ки интерфейсҳоро нисбат ба синфҳо ё синфҳои абстрактӣ то ҳадди имкон бартарӣ диҳем. Интерфейсҳо сабуктар, озмоиш ва нигоҳдорӣ осонтаранд ва инчунин таъсири манфии тағйироти татбиқро кам мекунанд. Бисёре аз усулҳои пешрафтаи барномасозӣ, ба монанди эҷоди синфҳои прокси дар китобхонаи стандартии Java, асосан ба интерфейсҳо такя мекунанд.

10. МЕРОСИ БИСЬЁРАНДА

Баръакси C++ ва баъзе забонҳои дигар, Java мероси сершуморро дастгирӣ намекунад: дар Java, ҳар як синф метавонад танҳо як волидайни мустақим дошта бошад (бо синф Objectдар болои иерархия). Аммо, синф метавонад интерфейсҳои сершуморро амалӣ созад ва аз ин рӯ, stacking интерфейс ягона роҳи ба даст овардани (ё тақлид кардани) мероси сершумор дар Java мебошад.
package com.javacodegeeks.advanced.design;

public class MultipleInterfaces implements Runnable, AutoCloseable {
    @Override
    public void run() {
        // Some implementation here
    }

    @Override
    public void close() throws Exception {
       // Some implementation here
    }
}
Татбиқи интерфейсҳои сершумор воқеан хеле пурқувват аст, аммо аксар вақт зарурати истифодаи такрорӣ ба иерархияи амиқи синфҳо ҳамчун роҳи бартараф кардани набудани дастгирии мероси сершумори Java оварда мерасонад. 
public class A implements Runnable {
    @Override
    public void run() {
        // Some implementation here
    }
}
// Class B wants to inherit the implementation of run() method from class A.
public class B extends A implements AutoCloseable {
    @Override
    public void close() throws Exception {
       // Some implementation here
    }
}
// Class C wants to inherit the implementation of run() method from class A
// and the implementation of close() method from class B.
public class C extends B implements Readable {
    @Override
    public int read(java.nio.CharBuffer cb) throws IOException {
       // Some implementation here
    }
}
Ва ғайра... Нашри охирини Java 8 то андозае масъаларо бо тазриқи усули пешфарз ҳал мекунад. Аз сабаби усулҳои пешфарз, интерфейсҳо воқеан на танҳо шартнома, балки татбиқро низ таъмин мекунанд. Аз ин рӯ, синфҳое, ки ин интерфейсҳоро амалӣ мекунанд, инчунин ба таври худкор ин усулҳои амалӣшударо мерос мегиранд. Барои намуна:
package com.javacodegeeks.advanced.design;

public interface DefaultMethods extends Runnable, AutoCloseable {
    @Override
    default void run() {
        // Some implementation here
    }

    @Override
    default void close() throws Exception {
       // Some implementation here
    }
}

// Class C inherits the implementation of run() and close() methods from the
// DefaultMethods interface.
public class C implements DefaultMethods, Readable {
    @Override
    public int read(java.nio.CharBuffer cb) throws IOException {
       // Some implementation here
    }
}
Дар хотир доред, ки мероси сершумор як воситаи хеле пурқувват, аммо дар айни замон хатарнок аст. Мушкилоти маъруфи алмоси марг аксар вақт ҳамчун як камбудии асосӣ дар татбиқи мероси сершумор номида мешавад, ки таҳиягаронро маҷбур мекунад, ки иерархияи синфҳоро бодиққат тарҳрезӣ кунанд. Мутаассифона, интерфейсҳои Java 8 бо усулҳои пешфарз низ қурбонии ин камбудиҳо мешаванд.
interface A {
    default void performAction() {
    }
}

interface B extends A {
    @Override
    default void performAction() {
    }
}

interface C extends A {
    @Override
    default void performAction() {
    }
}
Масалан, порчаи codeи зерин барои тартиб додан ноком мешавад:
// E is not compilable unless it overrides performAction() as well
interface E extends B, C {
}
Дар ин лаҳза бояд гуфт, ки Java ҳамчун забон ҳамеша кӯшиш мекард, ки аз ҳолатҳои кунҷии барномасозии ба an object нигаронидашуда канорагирӣ кунад, аммо бо таҳаввулоти забон, баъзе аз ин ҳолатҳо ногаҳон пайдо шуданд. 

11. МЕРОС ВА ТАРКИБ

Хушбахтона, мерос ягона роҳи тарҳрезии синфи шумо нест. Алтернативаи дигаре, ки бисёре аз таҳиягарон боварӣ доранд, аз мерос беҳтар аст, таркиб аст. Идеяи он хеле содда аст: ба ҷои ташкor иерархияи синфҳо, онҳо бояд аз синфҳои дигар иборат бошанд. Биёед ба ин мисол назар андозем:
// E is not compilable unless it overrides performAction() as well
interface E extends B, C {
}
Синф Vehicleаз муҳаррик ва чархҳо иборат аст (иловаи бисёр қисмҳои дигар, ки барои соддагӣ ҷудо карда шудаанд). Аммо, метавон гуфт, ки синф Vehicleниз муҳаррик аст, бинобар ин онро бо истифода аз мерос тарҳрезӣ кардан мумкин аст. 
public class Vehicle extends Engine {
    private Wheels[] wheels;
    // ...
}
Кадом ҳалли тарҳрезӣ дуруст хоҳад буд? Роҳнамои умумии асосӣ ҳамчун принсипҳои IS-A (аст) ва HAS-A (дорои) маълуманд. IS-A муносибати меросӣ аст: зерсинф инчунин мушаххасоти синфии синфи волидайн ва варианти синфи волидайнро қонеъ мекунад. зерсинфи) волидайни худро васеъ мекунад. Агар шумо хоҳед донед, ки як an object дигареро васеъ мекунад, санҷиши мувофиқат кунед - IS -A (аст).") Аз ин рӯ, HAS-A муносибати таркибӣ мебошад: синф дорои an objectест (ё дорои он аст), ки Дар аксари ҳолатҳо, принсипи HAS-A аз IS-A бо як қатор сабабҳо беҳтар кор мекунад: 
  • Тарҳ чандиртар аст;
  • Модели устувортар аст, зеро тағирот тавассути иерархияи синф паҳн намешавад;
  • Синф ва таркиби он дар муқоиса бо таркиб, ки волидайн ва зерсинфи онро зич муттаҳид мекунад, ба ҳам пайвастанд.
  • Қатори мантиқии тафаккур дар синф соддатар аст, зеро тамоми вобастагии он ба он, дар як ҷо дохил мешаванд. 
Новобаста аз он, мерос ҷои худро дорад ва як қатор мушкилоти тарҳрезии мавҷударо бо роҳҳои гуногун ҳал мекунад, аз ин рӯ набояд беэътиноӣ кард. Лутфан ин ду алтернативаро ҳангоми тарҳрезии модели ба an object нигаронидашуда дар хотир нигоҳ доред.

12. КАПСУЛЯЦИЯ.

Консепсияи инкапсуляция дар барномасозии ба an object нигаронидашуда аз он иборат аст, ки ҳама ҷузъиёти татбиқ (ба монанди ҳолати кор, усулҳои дохилӣ ва ғайра) аз ҷаҳони беруна пинҳон карда шавад. Манфиатҳои инкапсуляция нигоҳдорӣ ва осонии тағирот мебошанд. Татбиқи дохorи синф пинҳон аст, кор бо маълумоти синф танҳо тавассути усулҳои оммавии синф сурат мегирад (мушкилоти воқеӣ, агар шумо китобхона ё чаҳорчӯбаеро таҳия карда бошед, ки аз ҷониби бисёр одамон истифода мешавад). Инкапсуляция дар Java тавассути қоидаҳои намоён ва дастрасӣ ба даст оварда мешавад. Дар Java, таҷрибаи беҳтарин ҳисобида мешавад, ки ҳеҷ гоҳ майдонҳоро мустақиман фош накунанд, танҳо тавассути қабулкунандаҳо ва танзимкунандагон (агар майдонҳо ниҳоӣ нишон дода нашуда бошанд). Барои намуна:
package com.javacodegeeks.advanced.design;

public class Encapsulation {
    private final String email;
    private String address;

    public Encapsulation( final String email ) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getEmail() {
        return email;
    }
}
Ин мисол он чизеро, ки дар забони Java JavaBeans меноманд, ба хотир меорад : синфҳои стандартии Java мувофиқи маҷмӯи конвенсияҳо навишта мешаванд, ки яке аз онҳо имкон медиҳад, ки ба майдонҳо танҳо бо истифода аз усулҳои getter ва setter дастрас шаванд. Тавре ки мо аллакай дар бахши мерос таъкид карда будем, лутфан ҳамеша ба ҳадди ақали шартномаи таблиғотӣ дар синф бо истифода аз принсипҳои инкапсуляция риоя кунед. Ҳама чизе, ки набояд оммавӣ бошад, бояд хусусӣ гардад (ё муҳофизатшаванда/маҷмӯи хусусӣ, вобаста ба мушкилоте, ки шумо ҳал мекунед). Ин дар муддати тӯлонӣ бо додани озодии тарҳрезӣ бидуни (ё ҳадди аққал кам кардани) тағироти вайроншуда пардохт хоҳад кард. 

13. ДАРС ВА УСУЛИ ХОТИМАВЙ

Дар Java роҳе вуҷуд дорад, ки синф ба зеркласси дигар табдил ёбад: синфи дигар бояд ниҳоӣ эълон карда шавад. 
package com.javacodegeeks.advanced.design;

public final class FinalClass {
}
Худи ҳамон калиди ниҳоӣ дар эъломияи метод зерсинфҳоро аз бекор кардани метод пешгирӣ мекунад. 
package com.javacodegeeks.advanced.design;

public class FinalMethod {
    public final void performAction() {
    }
}
Барои муайян кардани он, ки синф ё усулҳо бояд ниҳоӣ бошанд ё не, қоидаҳои умумӣ вуҷуд надоранд. Синфҳо ва усулҳои ниҳоӣ васеъшавиро маҳдуд мекунанд ва дар оянда фикр кардан хеле душвор аст, ки оё синф бояд мерос гирифта шавад ё не, ё метод дар оянда бояд бекор карда шавад ё не. Ин махсусан барои таҳиягарони китобхона муҳим аст, зеро чунин қарорҳои тарҳрезӣ метавонад қобor татбиқи китобхонаро ба таври назаррас маҳдуд кунад. Китобхонаи стандартии Java якчанд намунаҳои дарсҳои ниҳоӣ дорад, ки машҳуртарини онҳо синфи String мебошад. Дар марҳилаи аввал, ин тасмим барои пешгирӣ кардани ҳама гуна кӯшишҳои таҳиягарон барои пайдо кардани ҳалли худ ва "беҳтар" барои татбиқи сатр гирифта шудааст. 

14. ПАЙДОН ЧИСТ

Дар ин қисми дарс мо мафҳумҳои барномасозии ба an object нигаронидашударо дар Java баррасӣ кардем. Мо инчунин ба барномасозии шартнома зуд назар кардем, ба баъзе мафҳумҳои функсионалӣ дахл кардем ва дидем, ки забон бо мурури замон чӣ гуна таҳаввул ёфтааст. Дар қисми навбатии дарс, мо бо генерикҳо вохӯрем ва чӣ гуна онҳо тарзи муносибати мо ба бехатарии навъи барномасозиро тағир медиҳанд. 

15. РАМЗИ САРЧАШВА-ро зеркашӣ кунед

Шумо метавонед манбаъро дар ин ҷо зеркашӣ кунед - advanced-java-part-3 Source: How to design Classes an
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION