May 1, 2012

မျိုးရိုးဆက်ခံမှု့နှင့် သတိထား​ရန်​အချက်​များ


မျိုးရိုးဆက်ခံမှု့ (Inheritance) အကြောင်း​ကို လေ့​လာ​ရာ​တွင်၊ မျိုး​ရိုး​ဆက်ခံ​စေသော Super Class နှင့် မျိုး​ရိုး​ဆက်ခံ​သော Sub Class တွေ​က ဘယ်​လို​ဖြစ်ပေါ်​လာ​တယ် ဆို​တာ​ကို လေ့​လာ​ကြည့်​မည် ဆို​လျှင် နားလည်​ရ​လွယ်ကူ လိမ့်​မည်။

မျိုး​ရိုး​ဆက်ခံ​မှု့​ရဲ့ အဓိက ရည်​ရွယ်​ချက်​သည် Super Class ရဲ့ ပိုင်ဆိုင်​မှု့​တွေ​ကို၊ အခြား​သော Class များ​မှ တ​ဆင့်​ပြန်​လို​အသုံးပြု လို​ခြင်း ဖြစ်​၏။ အောက်​ပါ Source Code ကို ကြည့်​ပါ။ SuperClass တွင် တန်ဖိုး 10 ရှိ​တဲ့ price ဆို​တဲ့ အချက်အလက်​နှင့် showPrice() ဆို​တဲ့ လုပ်ဆောင်​ချက်​ကို ပိုင်ဆိုင် ပါ​တယ်။ SubClass မှာ​တော့ Constructor သာ​ပိုင်ဆိုင်​ပြီး extends SuperClass ဆို​ပြီး SuperClass ရဲ့ အမွေ​ဆက်ခံ​မှု့​ကို ရ​ယူ​နေ​ပါ​တယ်။ တ​ဖန် Constructor ထဲ​တွင် price ၏ တန်ဖိုး​ကို 20 အဖြစ် အစားထိုး​နေ​၏။

SuperTest Class ထဲ​မှ main ထဲ​တွင် SubClass ရဲ့ instance ကို ခေါ်​ယူ​ပြီး showPrice() လုပ်ဆောင်​ချက်​ကို လုပ်ဆောင်​စေ​ပါ​တယ်။ အောက်​ပါ Source Code များ​ကို ကွန်​ပိုင်း​လုပ်​ပြီး Run ကြည့်​မည်​ဆို​ပါ​က The Price is 20 ဟု ကွန်​ဆိုး​တွင် ဖော်​ပြ​ပါ​လိမ့်​မည်။ ဤ​အချက် တစ်​ခု​တည်း​ကို​သာ ကြည့်​မည်​ဆို​ပါ​က SubClass ထဲ​မှ SuperClass ၏ အချက်အလက်​တွေ၊ လုပ်ဆောင်​ချက်​တွေ​ကို ဆက်​သွယ် အသုံး​ချ​နိုင် သ​လို​မြင်​နိုင် ပေ​လိမ့်​မည်။

package test;

class SuperClass {
    int price = 10;
    void showPrice() {
         System.out.println("The Price is " + price);
    }
}
class SubClass extends SuperClass{
    public SubClass() {
        price = 20;
    }
}
public class SuperTest {
   public static void main(String [] args) throws InstantiationException, IllegalAccessException {
        SubClass sub = SubClass.class.newInstance();
        sub.showPrice();
   }
}

တကယ်​ပဲ SuperClass ရဲ့ ပိုင်ဆိုင်​မှု့​တွေ​ကို SubClass မှ တိုက်ရိုက် အသုံးပြု​နိုင်​သလား ဆို​တာ​ကို ပို​သိ​ရအောင် ကျွှန်တော်​တို့ Source Code တွေ​ကို နည်း⁠နည်း​ပြင်​ကြည့်​ကြည့် ကြ​ရအောင်။

class SuperClass {
    int price;
    public SuperClass(int i) {
        price = i;
    }
    void showPrice() {
         System.out.println("The Price is " + price);
    }
}

အထက်​ပါ အတိုင်း SuperClass ကို ပြုပြင်​ပြီး Source Code များ​ကို ကွန်​ပိုင်း​လုပ်​ကြည့်​မည် ဆို​ပါ​က Compile Error ထွက်ပေါ်​မည် ဖြစ်​၏။ အဘယ်​ကြောင့်​ဆိုသော် SubClass ထဲ​တွင် SuperClass ရဲ့ Constructor ဖြစ်​တဲ့ SuperClass(int i) ကို မ​ရေးသား​ထား​သော​ကြောင့် ဖြစ်​သည်။ တ​နည်း​ဆို​ရသော် Memory ပေါ်​တွင် SubClass ကိုခေါ်​ယူ အသုံး​ချ​ရာ​တွင် နောက်​ကွယ်​တွင် SuperClass ကိုခေါ်​ယူ​ပြီး အသုံး​ချ​နေ​သော​ကြောင့် ဖြစ်​၏။ ကွန်​ပိုင်​လာ​မှ SuperClass ရဲ့ Instance ကို ခေါ်​ယူ​ဖို့​အတွက် Constructor ကို ခေါ်​ယူ​ရာ​တွင် int i ကို ရှာ​မ​တွေ့​ပါ​သ​ဖြင့် Error အဖြစ် ဖော်​ပြ​ခြင်း​ဖြစ်​ပါ​သည်။

အထက်​ပါ အချက်​ကို ကြည့်​ခြင်း​အား​ဖြင့် SuperClass ကို ပြောင်း​လည်း​မည်​ဆို​ပါ​က SubClass အပေါ်​တွင် တိုက်ရိုက် အကျိုး​သက်ရောက်​မှု့ များ​ရှိ​သည်​ဆို​သည်​ကို သိမြင်​နိုင်​ပေ​သည်။ အမွေ​ဆက်ခံ​မှု့​သည် Class တစ်​ခု​နှင့် တစ်​ခု​ကို ချုပ်​နှောင်​မှု့​တွေ​ကို ဖြစ်ပေါ်​စေ​သည် ဆို​သည့်​အချက်​သည် သတိထား​စရာ အချက်​ဖြစ်​၏။
အောက်​ပါ​အတိုင်း SubClass ကို ပြုပြင်​ရေးသား​မည် ဆို​ပါ​က ကွန်​ပိုင်း Error ထွက်ပေါ်​မည် မဟုတ်​တော့​ပေ။

class SubClass extends SuperClass{
    public SubClass() {
        super(20);
    }
}

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

Class တစ်​ခု​၏ ပိုင်ဆိုင်​မှု့​များ​ကို ပြန်လည်​အသုံး​ချ​လို​မှု့ တစ်​ခု​တည်း​မှ​တွေး​မည် ဆို​လျှင် အသုံးပြု​လို​သည့် Class ရဲ့ instance ကို ခေါ်​ယူ အသုံးပြု​မည် ဆို​ပါ​က ရ​ရှိ​နိုင်​၏။ မျိုး​ရိုး​ဆက်ခံ​မှု့​ကို အသုံးပြု​ခြင်း​၏ အကျိုး​ကျေးဇူး ကို​ပြ​ပါ​ဆို​ပါ​က မိဘ Class ရဲ့ instance ကို အလို​အလျှောက် ခေါ်​ယူ​နိုင်​ခြင်း၊ မိဘ instance ရဲ့ ပိုင်ဆိုင်​မှု့​တွေ​ကို အမည်တပ်​စရာ​မ​လို​ပဲ အသုံးပြု​နိုင်​ခြင်း တို့​သာ​ရှိ​မည်​ဟု မြင်​ပေ​မည်။

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

1 comment:

  1. အကိုေရ throws InstantiationException, IllegalAccessException ဘာလို႔ထည့္ရတာလဲဟင္
    ခုမွစေလ့လာတာမို႔ပါ

    ReplyDelete