May 2, 2012

Java နှင့် Polymorphism

ကျွှန်တော်​တို့ Easy Java ဟူသော ခေါင်းစဉ်​ဖြင့် Java ရဲ့ သဘော​တရား​များ၊ Java နဲ့ ပတ်သက်​တဲ့ OOP သဘော​တရား​များ​ကို၊ သုံး​သင့်​တဲ့​နေရာ မ​သုံး​သင့်​တဲ့​နေရာ များ​ကို​ခွဲ​ပြီး​လေ့​လာ​ခဲ့​၏။ ယခု​အကြိမ်​တွင် Java ကို အမြန်​ဆုံး​လေ့​လာ​ခြင်း ရဲ့ နောက်ဆုံး​အခေါက်​အနေ​နဲ့ OOP ရဲ့ အနှစ်သာရ ဖြစ်​တဲ့ Polymorphism အကြောင်း​ကို လေ့​လာ​သွား​ပါ​မည်။


ကျွှန်တော်​မှတ်မိ​ပါ​သေး​သည်။ ဤ​စကားလုံး Polymorphism အကြောင်း​ကို စ​သိ​ခဲ့​သည်မှာ ၁​၀​တန်း ဇီဝ​ဗေဒ​ဘာသာ သင်​ခန်း​စာ စာအုပ်​ထဲ​မှ​ဖြစ်​ပါ​သည်။ Ameba များ​၏ ပုံစံ​အမျိုး​မျိုး​ပြောင်း​လည်း​နိုင်​ပုံ​ကို Polymorphic ဟု​သုံး​နှုန်း​ထား​ခြင်း​ဖြစ်​၏။

Java နဲ့ OOP တွင် ဤ​စကားလုံး​ကို ပြန်ကြား​ရ​သော​အခါ၊ ဘယ်​လို​လုပ်​မှာ​လဲ ဟု​စဉ်းစား​ခဲ့​မိ​ပါ​သည်။ ဤ​အခန်း​သည် နည်း⁠နည်း​လည်း​ရှုပ်​၍၊ အသုံး​လည်း​ဝင်​ပါ​သ​ဖြင့် ကျွှန်တော်​တို့ Polymorphism ရဲ့ သဘော​တရား​နဲ့၊ Java က Polymorphism ကို ဘယ်​လို​ပုံဖော်​နေ​တယ်​ဆို​တာ​ကို အသေ​အချာ လေ့​လာ​မှတ်သား​ထား​ဖို့ လို​အပ်​ပေ​သည်။

လွယ်⁠လွယ်​နှင့် အဓိပ္ပါယ်​ဖွင့်​ရ​လျှင် လုပ်ဆောင်​ချက်​များ​မှာ​တူညီ​ပေ​မယ့်၊ ကွဲပြား​သော​လုပ်​ရပ်​များ​ကို Polymorphism ဟုခေါ်​သည် ဟု​ဆို​နိုင်​ပါ​သည်။ ဥ​မ​မာ​အား​ဖြင့် အောက်​ပါ​ပုံ​ပါ​အတိုင်း ခွေး​တစ်​ကောင်​ကို စကားပြော​ပါ​ဟု​ပြော​လျှင် ဝုတ်​ဝုတ် ဟု​အသံ​ထွက်​သ​လို၊ ကြောင်​တစ်​ကောင်​သည် ညှောင်⁠ညှောင်​ဟု အသံ​ထွက်​ပါ​လိမ့်​မည်။ ဤ​ကဲ့သို့​သော ပုံစံ​အမျိုး​မျိုး​ကွဲပြား​ပုံ​ကို Polymorphism ဟုခေါ်​ပါ​သည်။

ဟုတ်​ပြီ၊ ကျွှန်တော်​တို့ Java ဘက်​က​နေ​ပြန်​စဉ်းစား​ကြည့်​ကြ​ရအောင်။ Java မှာ လုပ်ဆောင်​ချက်​များ​ကို method နဲ့ ရေးသား​ပုံဖော်​နေ​ပါ​သ​ဖြင့်၊ တူညီ​သော Method တစ်​ခု​ဖြင့်၊ မ​တူညီ​သော​လုပ်ဆောင်​ချက်​များ​ကို လုပ်ဆောင်​ပေး​နိုင်​ခြင်း​ဟု အဓိပ္ပါယ်​ရ​ပါ​လိမ့်​မည်။ ကျွှန်တော်​တို့ လက်တွေ့ ရေး​ကြည့်​ကြ​ရအောင်။

Poly1.java
public class Poly1 {
    static void getName() {
        System.out.println("I am MinLwin");
    }

    static void getName(String name) {
        System.out.println("I am " + name);
    }

    public static void main(String [] args) {
        getName();
        getName("Chaw Su");
    }
}

အထက်​ပါ Poly1.java ကို ကွန်​ပိုင်း​လုပ်​ပြီး၊ အလုပ်​လုပ်​ခိုင်း​ကြည့်​ပါ​က အောက်​ပါ​အတိုင်း အလုပ်​လုပ်​မည်​ဖြစ်​သည်။ getNameဆို​တဲ့ လုပ်ဆောင်​ချက်​တစ်​ခု​တည်း​မှ အဖြေ​နှစ်​ခု​ရ​နေ​သည်​ကို တွေ့​မြင်​ရ​ပေ​မည်။ အဲ့​ဒီ​အတွက် Polymorphism ကို အသုံးပြု​နေ​သည်​ကို တွေ့​ရ​ပေ​မည်။


သေသေချာချာ​စဉ်းစား​ကြည့်​ပါ​က Overload နှင့်​ဘာ​မှ​မ​ကွာ​ပေ။ ဤသို့​ဆို​လျှင် Polymorphism ကို​အသုံးပြု​တဲ့ အကျိုး​ဘာ​များ​ရှိ​ပါ​ဦး​မည်​နည်း။ Polymorphism ၏​အကျိုး​ကျေးဇူး​များ​တွင် အမည်​တူ​ကို​အသုံးပြု​ခြင်း​အား​ဖြင့်၊ အမည်​အမျိုး​မျိုး​ကို​မှတ်​စရာ​မ​လို​ခြင်း၊ တ​ဖန် အမည်​တစ်​မျိုး​တည်း​ကို​သာ အသုံးပြု​ပါ​သ​ဖြင့် အမှား​နည်းပါး​စေ​ခြင်း အစ​ရှိ​တဲ့ ကျေးဇူး​များ​လည်း​ပါဝင်​ပေ​သည်။ သို့ရာတွင် အမည်​တူ​ကို​မ​သုံး​ပါ​လျှင် အဓိပ္ပါယ်​မ​ရှိ​ပါ။


Abstract Method and Abstract Class

ဤနေရာတွင် Java ဘာသာ​ရပ်​၌၊ abstract method (တကယ်​မ​ရှိ​ပေ​မယ့် ရှိ​သင့်​တဲ့​လုပ်ဆောင်​ချက်​များ) နဲ့ Override ကို အသုံးပြု​ခြင်း​အား​ဖြင့် Polymorphism ရဲ့ သဘော​တရား​တွေ​ကို အပြည့်​အဝ​ရ​ရှိ​စေ​ရန် စီစဉ်​ထား​ပေ​သည်။ ကျွှန်တော်​တို့ abstract class တစ်​ခု​ဖြစ်​တဲ့Pet ထဲ​မှာ လို​အပ်​တဲ့ လုပ်ဆောင်​ချက်​ဟာ greet() ရှိ​ကြောင်း abstract method တစ်​ခု​ဖြစ်​တဲ့ abstract void greet();ဟု​ရေးသား​ထား​ပါ​တယ်။ အဲ့​ဒီ​အတွက် Pet class ကို အမွေ​ဆက်ခံ​မည့် Class တွေ​မှာ ရှိ​သင့်​တဲ့ လုပ်ဆောင်​ချက် greet() ကို ရေးသား​ဖို့​လို​အပ်​ပါ​လိမ့်​မည်။
တ​ဖန် Cat နဲ့ Dog ကို Pet ရဲ့ အမွေ​ဆက်ခံ​စေ​ပြီးgreet() လုပ်ဆောင်​ချက်​ကို overrideလုပ်​ပြီး ရေးသား​စေ​ပါ​တယ်။

Poly2.java
public class Poly2 {
    static abstract class Pet {
        abstract void greet();
    }

    static class Cat extends Pet {
        void greet() {
            System.out.println("Meow");
        }
    }

    static class Dog extends Pet {
        void greet() {
            System.out.println("Woof");
        }
    }

    public static void main(String [] args) {
        Pet dog = new Dog();
        Pet cat = new Cat();
        
        dog.greet();
        cat.greet();
    }
}


ဤ​ကဲ့သို့ ရှိ​သင့်​တဲ့ Object ရဲ့ ပုံစံ​ကို abstract class မှာ​သက်​မှတ်​ခြင်း​အား​ဖြင့် အမျိုး​တူ Object အစုအဝေး​များ​ကို ရေးသား​နိုင်​မှာ​ဖြစ်​ပါ​တယ်။


Interface နှင့် Polymorphism

Abstract Method နဲ့ Override ကို အသုံးပြု​ခြင်း​အား​ဖြင့် Polymorphism ကို ပုံဖော်​နိုင်​ကြောင်းဖော်​ပြ​ခဲ့​ပြီး​ဖြစ်​သည်။ သို့ရာတွင် Java ၏​အမွေ​ဆက်ခံ​မှု့​တွင် ပြဿနာ​တစ်​ခု​ရှိ​ပါ​သေး​သည်။ ထို​အရာ​မှာ တစ်​ခု​တည်း​သော Class မှ​သာ အမွေ​ဆက်ခံ​နိုင်​ခြင်း ဖြစ်​၏။ အဲ့​ဒီ​အတွက် ရှိ​သင့်​တဲ့ လုပ်ဆောင်​ချက်​များ​ကို အများ​အပြား​အသုံးပြု​လို​ပါ​က အစ​ကတည်းက Super Class တွင် ကြို​ရေးထား​ဖို့​လို​အပ်​ပေ​မည်။ တ​ဖန် ရှိ​တဲ့ ရှိ​သင့်​တဲ့​လုပ်ဆောင်​ချက်​များ​ထဲ​မှ တချို့​တစ်ဝက်​ကို​သာ အသုံးပြု​လို​သည့်​အခါ​မှာ​လည်း ဒုက္ခ​များ​တက်​ပေ​သည်။

ထို​အခါ​မျိုး​တွင် အသုံးဝင်​သည်မှာ Interface ဖြစ်​ပေ​သည်။ Polymorphism ကို​လည်း ပုံဖော်​ပေး​ရင်း၊ တစ်​ခု​တည်း​သော Class မှ အမွေ​ဆက်ခံ​နိုင်​ခြင်း ပြဿနာ​ကို​လည်း​ဖြေ​ရှင်း​ပေး​နိုင်​ပါ​သည်။လို​အပ်​သော လုပ်ဆောင်​ချက်​များ​ကို ဖြည့်​စွက်​လို​ပါ​က interface များ​ကို အကြိမ်ကြိမ် ဖြည့်​စွက်​ခြင်း​အား​ဖြင့် အသေး​စိတ် Class ဒီ​ဇိုင်း​များ​ကို ပုံဖော်​နိုင်​မှာ​ဖြစ်​ပါ​တယ်။

Poly3.java
public class Poly3 {

    static abstract class Cat {
        public abstract void getVoice ();
    }

    static interface Pet {
        public void getOwner();
    }

    static class NyoKyee extends Cat implements Pet {
        @Override 
        public void getVoice() {
            System.out.println("Meow");
        }

        @Override
        public void getOwner() {
            System.out.println("Owner is Maung Maung.");
        }
    }

    public static void main(String [] args) {
        NyoKyee myCat = new NyoKyee();
        myCat.getVoice();
        myCat.getOwner();
    }
}


ပြန်လည်​သုံးသပ်​ချက်

ကျွှန်တော်​တို့ ဤ​အခန်း​တွင် Polymorphism ဆို​တာ​ဘာ​လဲ။ ပြီး​တော့ Java ဘက်​က​ကြည့်​တဲ့ Polymorphism ဆို​တာ​ဘာ​လဲ။ Polymorphism ရဲ့ အကျိုး​သက်ရောက်​မှု့​တွေ မှာ​ဘာ​တွေ​ရှိ​သလဲ။ Java နဲ့ Polymorphism ကို ဘယ်​လို​ပုံဖော်​နိုင်​သလဲ​ဆို​တာ​ကို အဓိက​ထား​၍ဖော်​ပြ​ခဲ့​သည်။

Polymorphism ဆို​သည်မှာ အမည်​တူ​လုပ်ဆောင်​ချက်​တွေ​ဖြင့်၊ မ​တူညီ​သော​ရလဒ်​များ​ကို ရ​ရှိ​စေ​ခြင်း​ဟု​အဓိပ္ပါယ်​ဖွင့်​နိုင်​ပါ​သည်။ ဤ​ကဲ့သို့ အမည်​တူ လုပ်ဆောင်​ချက်​များ​ကို အသုံးပြု​ခြင်း​အား​ဖြင့် မှတ်​ရ​လွယ်ကူ​စေ​ခြင်း၊ အမှား​နည်းပါး​စေ​ခြင်း အစ​ရှိ​တဲ့ အကျိုး​ကျေးဇူး​များ​အပြင်၊ လို​အပ်​တဲ့​လုပ်ဆောင်​ချက်​များ​ကို Super Class မှ အမွေ​ဆက်ခံ​ပြီး၊ ပြောင်း​ပြီး​ရေးသား​လို​တဲ့ လုပ်ဆောင်​ချက်​များ​ကို​သာ Override လုပ်​ခြင်း​အား​ဖြင့် Class အုပ်စု​များ​ကို ဖွဲ့​စည်း​နိုင်​ကြောင်း အစ​ရှိ​တဲ့ အကျိုး​ကျေးဇူး​များ​ကို ရ​ရှိ​စေ​နိုင်​ပါ​တယ်။

တ​ဖန် Java တွင် Polymorphism ကို ပုံဖော်​နိုင်​ရန် Overload, Override, Abstract Class and Method နဲ့ Interface များ​ကို အသုံးပြု​နိုင်​ကြောင်း ဖော်​ပြ​ခဲ့​၏။

ဘာသာ​ရပ်​တွေ၊ သဘော​တရား​တွေ၊ Framework တွေ နဲ့ နည်း​ပညာ​များ​သည် ကရိယာ​များ​သာ​ဖြစ်​ကြ​သည်။ အသုံးပြု​မည့်​သူ​မှာ ရေးသား​သူ​ကိုယ်တိုင်​ဖြစ်​သည်။ ကရိယာ​တွေ​ဘယ်လောက်​ကောင်း​ကောင်း အနှစ်သာရ​မ​ရှိ​လျှင် Application တစ်​ခု​ဟာ အသုံး​တည့်​မှာ​မဟုတ်​ပါ​ဘူး။ F1 ကား​ပြိုင်​ပွဲ​ကို ကြည့်​စေ​လို​ပါ​သည်။ အကောင်း​ဆုံး​စက်​တွေ​နဲ့ အမြင့်​မား​ဆုံး အမြန်​ကို ပြိုင်ဆိုင်​နေ​ကြ​သည်။ စက်​တွေ​ရဲ့ လုပ်ဆောင်​နိုင်​အား​သည် အဲ့​ဒီ​လောက်​မ​ကွာ​ကြ​ပါ။ ဒါ​ပေ​မယ့် ကား​မောင်း​သူ​ရဲ့ သ​ဘာ​နဲ့ အနိုင်​အရှုန်း​ဟာ စကားပြော​စေ​ပါ​တယ်။

အဲ့​ဒီ​အတွက် အသုံးပြု​သူ​တွေ​က​လည်း နည်း​ပညာ​တွေ​ကို ပိုင်နိုင်​အောင် လေ့​လာ​လေ့​ကျင့်​ထား​ဖို့​လို​အပ်​ပါ​တယ်။ နောက်​တစ်​ခု F1 မှာ​ပြိုင်​နေ​တဲ့ ကား​တွေ​ဟာ​လည်း သာမန်​လမ်း​တွေ​မှာ မောင်း​လို့​မလွယ်​နိုင်​ပါ​ဘူး။ အဲ့​ဒီ​လို​ပဲ Application တိုင်း​မှာ နာမည်ကြီး Framework တွေ၊ နည်း​ပညာ​တွေ​နဲ့ ဖြစ်​ချင်​မှ​ဖြစ်​မှာ​ပါ။ ဘယ်​နေရာ​မှာ​ဘာ​ကို​သုံး​သင့်​တယ်​ဆို​တာ ဘာ​တွေ​က​ဘယ်​လို​ရှိ​တယ်​ဆို​တာ​ကို မ​သိ​ပဲ​နဲ့ မ​ဆုံးဖြတ်​နိုင်​ဘူး​လို့​ထင်​ပါ​တယ်။

အဲ့​ဒီ​အတွက် ဒီ​အိုင်​တီ​လောက​ထဲ​ကို ဝင်​ချင့်​တဲ့ လူ​ငယ်​များ​ကို အကြံပေး​ပါ​ဟု​ဆို​လျှင်၊ စာ​ဖတ်​အား​ကောင်း​ပါ​စေ လို့​ပြော​ချင်​ပါ​သည်။ များ⁠များ​ဖက်၊ များ⁠များ​လေ့​လာ​ပြီး အကောင်း​ဆုံး Code များ​ကို​ရေ​သားရင်း ပီ​တိ​ဝေ​နိုင်​ကြ​ပါ​စေ။

1 comment:

  1. fantatic post mate, your picture made everything clear. In my opinion polymorphism is great and if used correctly it gives you immense capability to write flexible and extensible code
    here are few benefits of polymorphism in my opinion:

    1) Runtime binding using method overridding.
    2) Defining interface and providing implementation which can work with those interface.
    3) writing code for interfaces and not for implementation.

    By the way I have also shared my experience as What is polymorphism in Java , let me know how do you find it

    ReplyDelete