JavaRush /جاوا بلاگ /Random-SD /ڊيزائننگ ڪلاس ۽ انٽرفيس (مضمون جو ترجمو)
fatesha
سطح

ڊيزائننگ ڪلاس ۽ انٽرفيس (مضمون جو ترجمو)

گروپ ۾ شايع ٿيل
ڊيزائننگ ڪلاسز ۽ انٽرفيس (مضمون جو ترجمو) - 1

مواد

  1. تعارف
  2. انٽرفيس
  3. انٽرفيس مارڪرز
  4. فنڪشنل انٽرفيس، جامد طريقا ۽ ڊفالٽ طريقا
  5. خلاصو ڪلاس
  6. ناقابل بدل (مستقل) طبقن
  7. گمنام طبقن
  8. ڏيکاءُ
  9. وراثت
  10. گھڻن وراثت
  11. وراثت ۽ ساخت
  12. انڪپسوليشن
  13. آخري ڪلاس ۽ طريقا
  14. اڳتي ڇا آهي
  15. ڊائون لوڊ سورس ڪوڊ

1. تعارف

ڪابه پرواه ناهي ته توهان ڪهڙي پروگرامنگ ٻولي استعمال ڪندا آهيو (۽ جاوا ڪو به استثنا نه آهي)، سٺي ڊيزائن جي اصولن تي عمل ڪرڻ صاف، سمجھڻ، ۽ قابل تصديق ڪوڊ لکڻ جي ڪنجي آهي؛ ۽ اهو پڻ ٺاهيو ته اهو ڊگهو رهڻ لاءِ ۽ آساني سان مسئلو حل ڪرڻ ۾ مدد ڪري. سبق جي هن حصي ۾، اسان بنيادي عمارتن جي بلاڪن تي بحث ڪرڻ وارا آهيون جيڪي جاوا ٻولي مهيا ڪري ٿي ۽ توهان کي بهتر ڊيزائن جا فيصلا ڪرڻ ۾ مدد ڏيڻ جي ڪوشش ۾ ڪجهه ڊزائن جا اصول متعارف ڪرايون. وڌيڪ خاص طور تي، اسان ڊفالٽ طريقن (جاوا 8 ۾ هڪ نئين خصوصيت) استعمال ڪندي انٽرفيس ۽ انٽرفيس تي بحث ڪرڻ وارا آهيون، خلاصي ۽ فائنل ڪلاس، ناقابل قابل ڪلاس، وراثت، ساخت، ۽ نظر ثاني (يا رسائي) ضابطن تي اسان مختصر طور تي رابطو ڪيو آهي. حصو 1 سبق "ڪيئن ٺاهيون ۽ تباهه ڪن شيون" .

2. انٽرفيس

اعتراض تي مبني پروگرامنگ ۾، انٽرفيس جو تصور معاهدي جي ترقي لاء بنياد بڻجي ٿو . مختصر طور تي، انٽرفيس طريقن جو هڪ سيٽ بيان ڪري ٿو (معاهدو) ۽ هر ڪلاس جنهن کي انهي مخصوص انٽرفيس لاءِ سپورٽ جي ضرورت آهي انهن طريقن تي عمل درآمد مهيا ڪرڻ گهرجي: هڪ انتهائي سادو پر طاقتور خيال. ڪيتريون ئي پروگرامنگ ٻولين ۾ هڪ يا ٻئي صورت ۾ انٽرفيس آهن، پر جاوا خاص طور تي هن لاء ٻولي جي مدد فراهم ڪري ٿي. اچو ته جاوا ۾ هڪ سادي انٽرفيس جي تعريف تي هڪ نظر رکون.
package com.javacodegeeks.advanced.design;

public interface SimpleInterface {
void performAction();
}
مٿين حصي ۾، انٽرفيس جنهن کي اسان سڏيون ٿا SimpleInterface، صرف هڪ طريقو بيان ڪري ٿو performAction. انٽرفيس ۽ طبقن جي وچ ۾ بنيادي فرق اهو آهي ته انٽرفيس اهو بيان ڪن ٿا ته رابطو ڇا هجڻ گهرجي (اهي هڪ طريقي جو اعلان ڪن ٿا)، پر انهن تي عملدرآمد مهيا نه ڪن. تنهن هوندي، جاوا ۾ انٽرفيس وڌيڪ پيچيده ٿي سگهن ٿا: انهن ۾ شامل ٿي سگهن ٿا nested انٽرفيس، ڪلاس، شمار، تشريح، ۽ مستقل. مثال طور:
package com.javacodegeeks.advanced.design;

public interface InterfaceWithDefinitions {
    String CONSTANT = "CONSTANT";

    enum InnerEnum {
        E1, E2;
    }

    class InnerClass {
    }

    interface InnerInterface {
        void performInnerAction();
    }

    void performAction();
}
هن وڌيڪ پيچيده مثال ۾، ڪيتريون ئي پابنديون آهن جيڪي انٽرنيٽ غير مشروط طور تي nested تعميرات ۽ طريقن جي اعلانن تي لاڳو ڪن ٿيون جيڪي جاوا ڪمپلر لاڳو ڪري ٿو. سڀ کان پهريان، جيتوڻيڪ واضح طور تي اعلان نه ڪيو ويو آهي، هر طريقي جو اعلان هڪ انٽرفيس ۾ عوامي آهي (۽ صرف عوامي ٿي سگهي ٿو). اهڙيء طرح هيٺ ڏنل طريقا بيانن جي برابر آهن:
public void performAction();
void performAction();
اهو قابل ذڪر آهي ته هر هڪ طريقو هڪ انٽرفيس ۾ واضح طور تي اعلان ڪيو ويو آهي خلاصو ، ۽ جيتوڻيڪ اهي طريقا بيانن جي برابر آهن:
public abstract void performAction();
public void performAction();
void performAction();
جيئن ته اعلانيل مسلسل شعبن لاءِ، عوامي هجڻ کان علاوه ، اهي پڻ واضح طور تي جامد ۽ نشان لڳل فائنل آهن . تنهن ڪري هيٺيان بيان پڻ برابر آهن:
String CONSTANT = "CONSTANT";
public static final String CONSTANT = "CONSTANT";
آخرڪار، nested طبقن، انٽرفيس، يا شمار، عوامي هجڻ کان علاوه ، پڻ واضح طور تي جامد قرار ڏنو ويو آهي . مثال طور، اهي اعلان پڻ برابر آهن:
class InnerClass {
}

static class InnerClass {
}
انداز جيڪو توهان چونڊيو آهي اهو هڪ ذاتي ترجيح آهي، پر انٽرفيس جي انهن سادي خاصيتن کي ڄاڻڻ توهان کي غير ضروري ٽائپنگ کان بچائي سگهي ٿو.

3. انٽرفيس مارڪر

هڪ مارڪر انٽرفيس هڪ خاص قسم جو انٽرفيس آهي جنهن ۾ طريقا يا ٻيون ٺهيل تعميرات نه هونديون آهن. جاوا لائبريري ان کي ڪيئن بيان ڪري ٿي:
public interface Cloneable {
}
انٽرفيس مارڪرز ڪانٽريڪٽ في سي نه آهن، پر هڪ طبقي سان ڪجهه مخصوص خاصيتن کي ”منسلڪ ڪرڻ“ يا ”وابستگي“ ڪرڻ لاءِ ڪجهه مفيد ٽيڪنڪ آهن. مثال طور، ڪلون ايبل جي حوالي سان ، ڪلاس کي ڪلون ايبل طور نشان لڳايو ويو آهي، پر اهو طريقو جنهن ۾ هن کي لاڳو ڪري سگهجي ٿو يا ٿيڻ گهرجي، اهو انٽرفيس جو حصو ناهي. هڪ ٻيو تمام مشهور ۽ وڏي پيماني تي استعمال ٿيل مثال انٽرفيس مارڪر جو آهي Serializable:
public interface Serializable {
}
هي انٽرفيس ڪلاس کي سيريلائيزيشن ۽ ڊيسيريلائيزيشن لاءِ موزون قرار ڏئي ٿو، ۽ ٻيهر، اهو بيان نٿو ڪري ته اهو ڪيئن ٿي سگهي ٿو يا لاڳو ٿيڻ گهرجي. انٽرفيس مارڪرز کي اعتراض تي مبني پروگرامنگ ۾ سندن جاءِ هوندي آهي، جيتوڻيڪ اهي هڪ معاهدو ٿيڻ لاءِ انٽرفيس جو بنيادي مقصد پورا نه ڪندا آهن. 

4. فنڪشنل انٽرفيس، ڊفالٽ طريقا ۽ جامد طريقا

جاوا 8 جي رليز کان وٺي، انٽرفيس ڪجهه تمام دلچسپ نيون خاصيتون حاصل ڪيون آهن: جامد طريقا، ڊفالٽ طريقا، ۽ ليمبڊاس (فنڪشنل انٽرفيس) کان خودڪار تبديلي. انٽرفيس سيڪشن ۾، اسان ان حقيقت تي زور ڏنو ته جاوا ۾ انٽرفيس صرف طريقن جو اعلان ڪري سگھن ٿا، پر انھن تي عمل درآمد نه ڪندا آھن. ڊفالٽ طريقي سان، شيون مختلف آھن: ھڪڙو انٽرفيس ھڪڙي طريقي کي ڊفالٽ لفظ سان نشان لڳائي سگھي ٿو ۽ ان لاءِ عمل درآمد مهيا ڪري سگھي ٿو. مثال طور:
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
    }
}
اهو چئي سگهجي ٿو ته انٽرفيس ۾ عملدرآمد فراهم ڪرڻ معاهدي جي پروگرامنگ جي پوري مقصد کي شڪست ڏئي ٿو. پر اهڙا ڪيترائي سبب آهن ڇو ته اهي خاصيتون جاوا ٻولي ۾ متعارف ڪرايا ويا آهن ۽ ڪابه ڳالهه نه آهي ته اهي ڪيترا مفيد يا مونجهارو آهن، اهي توهان لاء ۽ توهان جي استعمال لاء آهن. فنڪشنل انٽرفيس هڪ مختلف ڪهاڻي آهي ۽ ثابت ڪيو آهي ته ٻولي لاء تمام مفيد اضافو آهي. بنيادي طور تي، هڪ فنڪشنل انٽرفيس هڪ انٽرفيس آهي جنهن تي صرف هڪ خلاصو طريقو بيان ڪيو ويو آهي. Runnableمعياري لائبريري انٽرفيس هن تصور جو هڪ تمام سٺو مثال آهي.
@FunctionalInterface
public interface Runnable {
    void run();
}
جاوا ڪمپلر فنڪشنل انٽرفيس کي مختلف طريقي سان علاج ڪري ٿو ۽ هڪ ليمبڊا فنڪشن کي فنڪشنل انٽرفيس تي عمل درآمد ۾ تبديل ڪري سگهي ٿو جتي اهو سمجھ ۾ اچي ٿو. اچو ته هيٺين فنڪشن جي وضاحت تي غور ڪريو: 
public void runMe( final Runnable r ) {
    r.run();
}
هن فنڪشن کي جاوا 7 ۽ هيٺان ۾ سڏڻ لاءِ، انٽرفيس جو هڪ نفاذ لازمي طور تي مهيا ڪيو وڃي Runnable(مثال طور گمنام طبقن جو استعمال)، پر جاوا 8 ۾ اهو ڪافي آهي ته رن () طريقي کي لاڳو ڪرڻ لاءِ لامبڊا نحو استعمال ڪندي:
runMe( () -> System.out.println( "Run!" ) );
اضافي طور تي، @FunctionalInterface تشريح (تشريحات تفصيل سان سبق جي پارٽ 5 ۾ شامل ڪئي ويندي) اشارو ڏئي ٿو ته مرتب ڪندڙ چيڪ ڪري سگهي ٿو ته ڇا انٽرفيس صرف هڪ خلاصو طريقو آهي، تنهنڪري مستقبل ۾ انٽرفيس ۾ ڪيل ڪا به تبديلي هن مفروضي جي ڀڃڪڙي نه ڪندي. .

5. خلاصو ڪلاس

هڪ ٻيو دلچسپ تصور جاوا ٻولي جي حمايت ڪئي آهي خلاصي طبقن جو تصور. خلاصي ڪلاس جاوا 7 ۾ انٽرفيس سان ڪجھه ملندڙ جلندڙ آھن ۽ جاوا 8 ۾ ڊفالٽ ميٿڊ انٽرفيس جي بلڪل ويجھو آھن. ريگولر ڪلاسن جي برعڪس، خلاصي ڪلاس کي فوري نٿو ڪري سگھجي، پر ان کي ذيلي ڪلاس ڪري سگھجي ٿو (وڌيڪ تفصيل لاءِ وراثت واري حصي کي ڏسو). وڌيڪ اهم، تجريدي طبقن ۾ تجريدي طريقا شامل ٿي سگهن ٿا: هڪ خاص قسم جو طريقو بغير ڪنهن عمل جي، صرف هڪ انٽرفيس وانگر. مثال طور:
package com.javacodegeeks.advanced.design;

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

    public abstract void performAnotherAction();
}
ھن مثال ۾، ڪلاس کي خلاصوSimpleAbstractClass قرار ڏنو ويو آھي ۽ ھڪڙي اعلان ڪيل خلاصي طريقي تي مشتمل آھي. خلاصو ڪلاس ڏاڍا ڪارآمد آهن؛ عمل درآمد جي تفصيل جا گھڻا يا ڪجھ حصا ڪيترن ئي ذيلي ڪلاسن ۾ شيئر ڪري سگھجن ٿا. جيئن ته اهو ٿي سگهي ٿو، اهي اڃا تائين دروازي کي ڇڏي ڇڏيندا آهن ۽ توهان کي تجريدي طريقن سان استعمال ڪندي هر ذيلي ڪلاس ۾ موروثي رويي کي ترتيب ڏيڻ جي اجازت ڏين ٿا. اها ڳالهه قابل ذڪر آهي ته انٽرفيس جي برعڪس، جنهن ۾ صرف عوامي بيان شامل ٿي سگهن ٿا، خلاصو طبقن کي رسائي جي ضابطن جي مڪمل طاقت استعمال ڪري سگهي ٿي خلاصي طريقي جي نمائش کي ڪنٽرول ڪرڻ لاءِ.

6. فوري ڪلاس

اڄڪلهه سافٽ ويئر ڊولپمينٽ ۾ غير موثريت وڌيڪ ۽ وڌيڪ اهم ٿي رهي آهي. ملٽي-ڪور سسٽم جي اڀار ڊيٽا شيئرنگ ۽ متوازي سان لاڳاپيل ڪيترائي مسئلا پيدا ڪيا آهن. پر هڪ مسئلو ضرور پيدا ٿيو آهي: ٿوري (يا اڃا به نه) تبديل ٿيندڙ رياست هجڻ ڪري سسٽم جي باري ۾ بهتر توسيع (اسڪيليبلٽي) ۽ آسان استدلال. بدقسمتي سان، جاوا ٻولي طبقاتي عدم استحڪام لاء مهذب سپورٽ مهيا نه ڪري ٿي. بهرحال، ٽيڪنالاجي جي ميلاپ کي استعمال ڪندي، اهو ممڪن آهي ته طبقن کي ڊزائين ڪرڻ لاء جيڪي ناقابل قابل آهن. سڀ کان پهريان، ڪلاس جا سڀ شعبا حتمي ٿيڻ گهرجن ( فائنل طور نشان لڳل ). هي هڪ سٺي شروعات آهي، پر اها ڪا به ضمانت نه آهي. 
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 );
}
۽ آخرڪار، مناسب پهچ کي يقيني بڻائڻ (حاصل ڪندڙ). مجموعن لاءِ، immutability لازمي طور تي مهيا ڪئي وڃي هڪ لفافي جي طور تي  Collections.unmodifiableXxx: arrays سان، صحيح عدم استحڪام مهيا ڪرڻ جو واحد طريقو صف جي حوالي سان موٽڻ بدران ڪاپي مهيا ڪرڻ آهي. اهو شايد عملي نقطي نظر کان قابل قبول نه هجي، ڇاڪاڻ ته اهو صف جي سائيز تي تمام گهڻو منحصر آهي ۽ ڪچري جي ڪليڪٽر تي تمام گهڻو دٻاء وجهي سگهي ٿو.
public String[] getArrayOfStrings() {
    return Arrays.copyOf( arrayOfStrings, arrayOfStrings.length );
}
جيتوڻيڪ هي ننڍڙو مثال هڪ سٺو خيال ڏئي ٿو ته غير مستحڪم اڃا تائين جاوا ۾ هڪ فرسٽ ڪلاس شهري ناهي. شيون پيچيدگيون ٿي سگهن ٿيون جيڪڏهن ناقابل قابل ڪلاس وٽ هڪ فيلڊ آهي جيڪو ڪنهن ٻئي طبقي جي اعتراض ڏانهن اشارو ڪري ٿو. انهن طبقن کي پڻ غير مستحڪم هجڻ گهرجي، پر ان کي يقيني بڻائڻ جو ڪو طريقو ناهي. اهڙا ڪيترائي مهذب جاوا سورس ڪوڊ تجزيي وارا آهن، جهڙوڪ FindBugs ۽ PMD، جيڪي توهان جي ڪوڊ کي جانچڻ ۽ عام جاوا پروگرامنگ جي خامين کي اشارو ڪندي مدد ڪري سگھن ٿا. اهي اوزار ڪنهن جاوا ڊولپر جا عظيم دوست آهن.

7. گمنام ڪلاس

جاوا 8 کان اڳ واري دور ۾، گمنام طبقن کي يقيني بڻائڻ جو واحد طريقو هو ڪلاسن کي اڏام تي بيان ڪيو ويو ۽ فوري طور تي فوري طور تي مقرر ڪيو ويو. گمنام طبقن جو مقصد بوائلر پليٽ کي گھٽائڻ ۽ رڪارڊ جي طور تي طبقن جي نمائندگي ڪرڻ لاء هڪ مختصر ۽ آسان رستو مهيا ڪرڻ هو. اچو ته جاوا ۾ هڪ نئين موضوع کي جنم ڏيڻ لاء عام پراڻي طريقي تي نظر رکون:
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فوري طور تي هڪ گمنام طبقي طور مهيا ڪيو ويو آهي. جيتوڻيڪ گمنام طبقن سان لاڳاپيل ڪجهه حدون آهن، انهن کي استعمال ڪرڻ جا بنيادي نقصان انتهائي لفظي تعميراتي نحو آهن جيڪي جاوا هڪ ٻولي طور تي پابند آهن. جيتوڻيڪ صرف هڪ گمنام طبقو جيڪو ڪجهه نٿو ڪري، گهٽ ۾ گهٽ 5 لائنن جي ڪوڊ جي ضرورت آهي هر وقت اهو لکيو ويو آهي.
new Runnable() {
   @Override
   public void run() {
   }
}
خوش قسمتي سان، جاوا 8، ليمبڊا ۽ فنڪشنل انٽرفيس سان، اهي سڀئي اسٽريٽائپس جلد ئي ختم ٿي ويندا، آخرڪار جاوا ڪوڊ لکڻ بلڪل جامع نظر ايندو.
package com.javacodegeeks.advanced.design;

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

8. visibility

اسان اڳ ۾ ئي سبق جي حصو 1 ۾ جاوا ۾ نمائش ۽ رسائي جي ضابطن بابت ٿورو ڳالهايو. هن حصي ۾، اسان هن موضوع تي ٻيهر نظرثاني ڪرڻ وارا آهيون، پر ذيلي ڪلاسنگ جي حوالي سان. ڊيزائننگ ڪلاسز ۽ انٽرفيس (مضمون جو ترجمو) - 2مختلف سطحن تي ڏيکاءُ طبقن کي ٻين طبقن يا انٽرفيسز کي ڏسڻ جي اجازت ڏئي ٿو يا روڪي ٿو (مثال طور، جيڪڏهن اهي مختلف پيڪيجز ۾ آهن يا هڪ ٻئي جي اندر اندر رکيل آهن) يا ذيلي ڪلاسز کي انهن جي والدين جي طريقن، تعمير ڪندڙن ۽ شعبن کي ڏسڻ ۽ رسائي ڪرڻ کان. ايندڙ حصي ۾، وراثت، اسان هن کي عمل ۾ ڏسندا سين.

9. وراثت

وراثت اعتراض تي مبني پروگرامنگ جي اهم تصورن مان هڪ آهي، رشتي جي طبقي جي تعمير لاء بنياد جي طور تي خدمت ڪندي. نمائش ۽ رسائي جي ضابطن سان گڏ، وراثت طبقن کي ترتيب ڏيڻ جي اجازت ڏئي ٿي هڪ درجي بندي ۾ جيڪا وڌائي ۽ برقرار رکي سگهجي ٿي. هڪ تصوراتي سطح تي، جاوا ۾ وراثت کي لاڳو ڪيو ويندو آهي ذيلي ڪلاسنگ ۽ extensions keyword استعمال ڪندي ، والدين طبقي سان گڏ. ھڪڙو ذيلي ڪلاس والدين طبقي جي سڀني عوامي ۽ محفوظ عناصر کي ورثي ۾ ڏئي ٿو. اضافي طور تي، هڪ ذيلي ڪلاس ان جي والدين طبقي جي پئڪيج-پرائيويٽ عناصر کي ورثي ۾ ڏئي ٿو جيڪڏهن ٻئي (ذيلي ڪلاس ۽ ڪلاس) ساڳئي پيڪيج ۾ آهن. اهو چيو پيو وڃي، اهو تمام ضروري آهي، ڪنهن به صورت ۾ توهان جيڪي به ڊزائين ڪرڻ جي ڪوشش ڪري رهيا آهيو، انهن طريقن جي گهٽ ۾ گهٽ سيٽ تي قائم رهڻ لاءِ جيڪي هڪ طبقو عوام يا ان جي ذيلي طبقن کي ظاهر ڪري ٿو. مثال طور، اچو ته ڪلاس 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";
    }
}
وراثت پاڻ ۾ هڪ تمام وڏو موضوع آهي، جاوا لاءِ تمام گهڻي تفصيل سان مخصوص. تنهن هوندي، ڪجھ قاعدا آھن جن تي عمل ڪرڻ آسان آھي ۽ ڪلاس جي درجه بندي جي اختصار کي برقرار رکڻ ۾ ھڪڙو ڊگهو رستو وٺي سگھي ٿو. جاوا ۾، هر ذيلي ڪلاس پنهنجي والدين جي ڪنهن به وراثت واري طريقن کي ختم ڪري سگهي ٿو جيستائين ان کي حتمي قرار نه ڏنو ويو آهي. بهرحال، اتي ڪو خاص نحو يا لفظ نه آهي ته جيئن ڪنهن طريقي کي اوور رائڊ ڪيو وڃي، جيڪو مونجهاري جو سبب بڻجي سگهي. اهو ئي سبب آهي ته @Override annotation متعارف ڪرايو ويو : جڏهن به توهان جو مقصد ڪنهن وراثت واري طريقي کي ختم ڪرڻ آهي، مهرباني ڪري استعمال ڪريو @Override تشريح ان کي مختصر طور تي ظاهر ڪرڻ لاءِ. هڪ ٻيو مشڪوڪ جيڪو جاوا ڊولپرز کي مسلسل ڊيزائن ۾ منهن ڏيڻو پوي ٿو اهو آهي ڪلاس جي ترتيب جي تعمير (ڪنڪريٽ يا تجريدي طبقن سان) بمقابله انٽرفيس تي عمل درآمد. اسان سختي سان سفارش ڪريون ٿا ته انٽرفيس کي طبقن يا خلاصو طبقن تي جڏهن به ممڪن هجي. انٽرفيس هلڪا آهن، جانچڻ ۽ برقرار رکڻ ۾ آسان آهن، ۽ لاڳو ٿيندڙ تبديلين جي ضمني اثرات کي پڻ گھٽ ڪن ٿا. ڪيتريون ئي ترقي يافته پروگرامنگ ٽيڪنڪ، جهڙوڪ جاوا معياري لائبريري ۾ پراکسي ڪلاس ٺاهڻ، انٽرفيس تي تمام گهڻو انحصار ڪن ٿا.

10. گھڻن وراثت

C++ ۽ ڪجهه ٻين ٻولين جي برعڪس، جاوا ڪيترن ئي ورثي کي سپورٽ نٿو ڪري: جاوا ۾، هر طبقي کي صرف هڪ سڌو والدين ٿي سگهي ٿو (طبقات سان گڏ Objectدرجه بندي جي چوٽي تي). بهرحال، هڪ ڪلاس ڪيترن ئي انٽرفيس کي لاڳو ڪري سگهي ٿو، ۽ اهڙيء طرح انٽرفيس اسٽيڪنگ جاوا ۾ هڪ کان وڌيڪ وراثت حاصل ڪرڻ (يا تخليق ڪرڻ) جو واحد طريقو آهي.
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
    }
}
ڪيترن ئي انٽرفيس کي لاڳو ڪرڻ اصل ۾ ڪافي طاقتور آهي، پر اڪثر ڪري لاڳو ڪرڻ جي ضرورت کي بار بار استعمال ڪرڻ جي ضرورت آهي، جاوا جي ڪيترن ئي ورثي جي حمايت جي کوٽ کي ختم ڪرڻ لاء هڪ طريقي جي طور تي گہرے طبقي جي درجي بندي کي. 
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
    }
}
وغيره وغيره... جاوا 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
    }
}
ذهن ۾ رکون ٿا ته هڪ کان وڌيڪ وراثت هڪ تمام طاقتور آهي، پر ساڳئي وقت خطرناڪ اوزار. ڊولپرز کي مجبور ڪري ٿو ته ڊولپرز کي مجبور ڪيو وڃي ته ڊولپرز کي ڪلاس جي درجي بندي کي تمام احتياط سان ترتيب ڏيڻ تي عمل ڪرڻ ۾ موت جو مشهور ڊائمنڊ آف ڊيٿ مسئلو. بدقسمتي سان، جاوا 8 انٽرفيس ڊفالٽ طريقن سان پڻ انهن خرابين جو شڪار ٿين ٿا.
interface A {
    default void performAction() {
    }
}

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

interface C extends A {
    @Override
    default void performAction() {
    }
}
مثال طور، هيٺ ڏنل ڪوڊ جو ٽڪرو گڏ ڪرڻ ۾ ناڪام ٿيندو:
// E is not compilable unless it overrides performAction() as well
interface E extends B, C {
}
هن موقعي تي، اهو چوڻ مناسب آهي ته جاوا هڪ ٻولي جي طور تي هميشه اعتراض تي مبني پروگرامنگ جي ڪنڊ ڪيسن کان بچڻ جي ڪوشش ڪئي آهي، پر جيئن ٻولي ترقي ڪري ٿي، انهن مان ڪجهه ڪيس اوچتو ظاهر ٿيڻ شروع ٿي ويا آهن. 

11. وراثت ۽ ترتيب

خوشقسمتيء سان، وراثت توهان جي طبقي کي ڊزائين ڪرڻ جو واحد طريقو ناهي. ٻيو متبادل جيڪو ڪيترن ئي ڊولپرز کي يقين آهي ته وراثت کان گهڻو بهتر آهي ساخت آهي. خيال بلڪل سادو آهي: طبقن جو هڪ درجو ٺاهڻ بدران، انهن کي ٻين طبقن مان ٺهيل هجڻ جي ضرورت آهي. اچو ته هن مثال کي ڏسو:
// 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 (is) ۽ HAS-A (شامل آھن) اصولن طور سڃاتل آھن. IS-A ھڪڙو وراثت وارو تعلق آھي: ھڪڙو ذيلي ڪلاس پڻ والدين طبقي جي ڪلاس جي وضاحت ۽ والدين طبقي جي ھڪڙي تبديلي کي پورو ڪري ٿو. ذيلي ڪلاس) پنھنجي والدين کي وڌائي ٿو. جيڪڏھن توھان ڄاڻڻ چاھيو ٿا ته ڇا ھڪڙو ادارو ٻئي کي وڌائي ٿو، ھڪڙي ميچ ٽيسٽ ڪريو - IS -A (آهي).") تنهن ڪري، HAS-A هڪ ٺهيل تعلق آهي: هڪ طبقي جو مالڪ آهي (يا ان تي مشتمل آهي) هڪ اعتراض جيڪو اڪثر ڪيسن ۾، HAS-A اصول ڪيترن ئي سببن جي ڪري IS-A کان بهتر ڪم ڪري ٿو: 
  • ڊيزائن وڌيڪ لچڪدار آهي؛
  • ماڊل وڌيڪ مستحڪم آهي ڇاڪاڻ ته تبديلي طبقاتي ترتيب جي ذريعي پروپيگنڊا نه ڪندو آهي.
  • هڪ طبقو ۽ ان جي جوڙجڪ ٺهيل جي مقابلي ۾ آساني سان جوڙيل آهن، جيڪو مضبوط طور تي والدين ۽ ان جي ذيلي طبقي کي جوڙي ٿو.
  • هڪ طبقي ۾ فڪر جي منطقي ٽرين آسان آهي، ڇاڪاڻ ته ان ۾ سڀ انحصار شامل آهن، هڪ جاء تي. 
ان جي باوجود، وراثت ان جي جاء تي آهي ۽ مختلف طريقن سان ڪيترن ئي موجوده ڊيزائن جي مسئلن کي حل ڪري ٿو، تنهنڪري ان کي نظرانداز نه ڪيو وڃي. مھرباني ڪري انھن ٻن متبادلن کي ذهن ۾ رکو جڏھن توھان جي اعتراض تي مبني ماڊل ٺاھيو.

12. انڪپسوليشن.

اعتراض تي مبني پروگرامنگ ۾ encapsulation جو تصور ٻاهرين دنيا کان سڀني عمل درآمد جي تفصيلن (جهڙوڪ آپريٽنگ موڊ، اندروني طريقا، وغيره) کي لڪائڻ آهي. encapsulation جا فائدا برقرار رکڻ ۽ تبديلي جي آساني آهن. ڪلاس جو اندروني عمل لڪيل آهي، ڪلاس جي ڊيٽا سان ڪم ڪرڻ خاص طور تي ڪلاس جي عوامي طريقن سان ٿئي ٿو (هڪ حقيقي مسئلو جيڪڏهن توهان لائبريري يا فريم ورڪ ٺاهي رهيا آهيو ڪيترن ئي ماڻهن طرفان استعمال ٿيل آهي). جاوا ۾ Encapsulation نمائش ۽ رسائي جي ضابطن جي ذريعي حاصل ڪئي وئي آهي. جاوا ۾، اھو بھترين عمل سمجھيو ويندو آھي ڪڏھن بھ فيلڊن کي سڌو سنئون، صرف گيٽرز ۽ سيٽرز جي ذريعي (جيستائين فيلڊز کي حتمي طور تي نشان لڳايو وڃي). مثال طور:
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;
    }
}
هي مثال ياد ڏياريندڙ آهي جنهن کي جاوا ٻولي ۾ JavaBeans سڏيو ويندو آهي: معياري جاوا ڪلاس ڪنوينشن جي هڪ سيٽ جي مطابق لکيا ويندا آهن، جن مان هڪ فيلڊ کي صرف گيٽر ۽ سيٽٽر طريقن سان رسائي حاصل ڪرڻ جي اجازت ڏئي ٿو. جيئن ته اسان اڳ ۾ ئي وراثت واري حصي ۾ زور ڏنو آهي، مهرباني ڪري هميشه هڪ طبقي ۾ گهٽ ۾ گهٽ پبلسٽي معاهدي تي عمل ڪريو، encapsulation جي اصولن کي استعمال ڪندي. هر شي جيڪا عوامي نه هجڻ گهرجي پرائيويٽ ٿيڻ گهرجي (يا محفوظ ٿيل/پيڪيج خانگي، ان مسئلي تي منحصر آهي جيڪو توهان حل ڪري رهيا آهيو). اهو توهان کي آزاديءَ سان (يا گهٽ ۾ گهٽ گهٽ ۾ گهٽ) ٽوڙڻ واري تبديلين جي ڊيزائن ڪرڻ جي ذريعي ڊگهي عرصي ۾ ادا ڪندو. 

13. فائنل ڪلاس ۽ طريقا

جاوا ۾، ھڪڙي طبقي کي ٻئي طبقي جي ذيلي ڪلاس ٿيڻ کان روڪڻ جو ھڪڙو طريقو آھي: ٻئي طبقي کي حتمي قرار ڏنو وڃي. 
package com.javacodegeeks.advanced.design;

public final class FinalClass {
}
ساڳئي آخري لفظ هڪ طريقي جي اعلان ۾ ذيلي طبقن کي طريقي سان ختم ڪرڻ کان روڪي ٿو. 
package com.javacodegeeks.advanced.design;

public class FinalMethod {
    public final void performAction() {
    }
}
اهو فيصلو ڪرڻ لاءِ ڪي به عام قاعدا نه آهن ته هڪ طبقو يا طريقا حتمي هجن يا نه. آخري طبقن ۽ طريقن جي توسيع کي محدود ڪيو وڃي ٿو ۽ اهو سوچڻ تمام ڏکيو آهي ته ڇا هڪ طبقي کي وراثت ۾ هئڻ گهرجي يا نه، يا ڇا هڪ طريقو مستقبل ۾ ختم ٿيڻ گهرجي يا نه. اهو خاص طور تي لائبريري ڊولپرز لاءِ اهم آهي، ڇاڪاڻ ته ڊزائن جا فيصلا اهڙي طرح لائبريري جي قابل اطلاق حد تائين محدود ڪري سگهن ٿا. جاوا معياري لائبريري ۾ فائنل ڪلاس جا ڪيترائي مثال آهن، جن ۾ سڀ کان وڌيڪ مشهور اسٽرنگ ڪلاس آهي. شروعاتي اسٽيج تي، اهو فيصلو ڊولپرز طرفان ڪنهن به ڪوشش کي روڪڻ لاءِ ڪيو ويو هو پنهنجي پاڻ سان گڏ اچڻ لاءِ، "بهتر" حل لاڳو ڪرڻ لاءِ. 

14. اڳتي ڇا آهي

سبق جي هن حصي ۾، اسان جاوا ۾ اعتراض تي مبني پروگرامنگ جي تصورن کي ڍڪي ڇڏيو. اسان ٺيڪيدار پروگرامنگ تي هڪ تڪڙو نظر پڻ ورتو، ڪجهه فنڪشنل تصورن کي ڇڪيو ۽ ڏسو ته ٻولي ڪيئن وقت سان ترقي ڪئي آهي. سبق جي ايندڙ حصي ۾، اسان جنريڪس سان ملڻ وارا آهيون ۽ ڪيئن اهي طريقي سان تبديل ڪريون ٿا جيڪو اسان پروگرامنگ ۾ قسم جي حفاظت ڏانهن وڃو. 

15. سورس ڪوڊ ڊائون لوڊ ڪريو

توھان ھي ماخذ ڊائون لوڊ ڪري سگھو ٿا ھتي - Advanced-java-part-3 Source: How to design Classes an
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION