May 8, 2012

Interface

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

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

Java နှင့်ပတ်သက်၍ Easy Java API ဟူသော ခေါင်းစဉ်ဖြင့် Java ပရိုဂရမ်များကို ရေးသားရာတွင် မရှိမဖြစ်လိုအပ်သော API များအကြောင်းကို ဆက်လက်၍ ရေးသားဖော်ပြသွားပါဦးမည်။


Interface ဆိုသည်မှာ


အင်တာဖေစ် ဆိုသည်မှာ Object တစ်ခု၏ စွမ်းဆောင်နိုင်မှု့ကို သက်မှတ်ပေးနိုင်သော ကလပ်စ် တစ်မျိုးဖြစ်၏။ အလွယ်ဆုံး ဆိုရမည် ဆိုလျှင် Object မှ အသုံးပြုနိုင်သော လုပ်ဆောင်ချက်များနှင့်၊ ကိန်းသေ များကို စုစည်းဖော်ပြထားခြင်း ဖြစ်ပါသည်။

အင်တာဖေစ်သည် ယခင်တစ်ခေါက် ဖော်ပြခဲ့သော Abstract Class နှင့် အလွန်ဆင်ပါသည်။ အင်တာဖေစ်သည် မိမိကိုယ်တိုင်မှ instance လုပ်၍မရနိုင်ပေ။ တဖန် အင်တာဖေစ်အား ပံ့ပိုးထားသော ကလပ်စ် တစ်ခုသည်၊ ထိုအင်တာဖေစ်တွင် သက်မှတ်ထားသော လုပ်ဆောင်ချက်များအား Override လုပ်ပြီး ရေးသားရန် လိုအပ်ပါသည်။

အထက်ပါအချက်များကို ကြည့်ရုံဆိုပါက အင်တာဖေစ်နှင့် Abstract Class သည် အတူတူလို့တောင် ထင်နိုင်ပါသည်။ သို့ရာတွင် ကလပ်စ်တစ်ခုမှ အင်တာဖေစ် အမျိုးမျိုးကို ပံ့ပိုးနိုင်ခြင်း၊ အင်တာဖေစ်များကို ပံ့ပိုးခြင်းသည် ကလပ်စ်များအကြားတွင် မှီခိုမှု့ကို မဖြစ်ပွားစေခြင်း အစရှိသည့် အချက်များက အင်တာဖေစ်နှင့် Abstract Class တို့၏ ကွာခြားချက်များ ဖြစ်ကြပါသည်။

အကျဉ်းချုပ်ဆိုရမည် ဆိုလျှင် အောက်ပါအတိုင်းဖြစ်သည်။

  • အင်တာဖေစ် တစ်ခုမှ Object ကို တိုက်ရိုက် instance လုပ်နိုင်ခွင့်မရှိပါ။
  • အင်တာဖေစ်အား ပံ့ပိုးထားသော ကလပ်စ်သည် ထိုအင်တာဖေစ် တွင်သတ်မှတ်ထားသော လုပ်ဆောင်ချက်များအား ဖြည့်စွက်ရေးသားရန် လိုအပ်ပါသည်။
  • အင်တာဖေစ်တွင် သတ်မှတ်ရေးသားထားသော ကိန်းရှင်များသည်၊ ပြုပြင် ပြောင်းလည်း၍မရနိုင်သော ကိန်းသေများ ဖြစ်ကြပါသည်။

မှတ်ချက်

Java ဘာသာရပ်တွင် Super Class တစ်ခုတည်းမှသာ မျိုးရိုးဆက်ခံခွင့်ရရှိခြင်းသည်၊ အကဲ၍ အမျိုးတူ အမည်တူလုပ်ဆောင်ချက်များကို Super Class များက ပိုင်ဆိုင်ခဲ့ပါက၊ Sub Class ထဲတွင် မည်သည့် လုပ်ဆောင်ချက်ကို အသုံးပြုသင့်သည်ကို ကွန်ပိုင်းလာမှ ဝေခွဲ၍ မရသောကြောင့် ဖြစ်ပါသည်။


Interface အား သတ်မှတ်ရေးသားပုံ


Interface အား ရေးသားပုံ

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

Scanner.java
import java.util.List;

public interface Scanner {
 public List<Stringt> scanLines();
 public long getSize();
}

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


Interface အား ပံ့ပိုးသော Class အား ရေးသားပုံ

အထက်တွင် ဖော်ပြခဲ့သည့်အတိုင်း အင်တာဖေစ်များမှ တိုက်ရိုက် instance လုပ်၍မရနိုင်ပေ။ အင်တာဖေစ်၏ Object များကို အသုံးပြုလိုပါက၊ အင်တာဖေစ်ကို ပံ့ပိုးပေးထားသော Class များကို instance လုပ်ယူမှ ရနိုင်မည် ဖြစ်ပါသည်။ ကလပ်စ်တစ်ခုမှ အင်တာဖေစ်အား ပံ့ပိုးရန်မှာ implements စကားလုံးကို အသုံးပြုရန် လိုအပ်ပါသည်။ ရေးသားပုံမှာ အောက်ပါအတိုင်းဖြစ်၏။

Scanner.java
class MyScanner implements Scanner {

 @Override
 public List<String> scanLines() {
  // TODO Write about scan
  return null;
 }

 @Override
 public long getSize() {
  // TODO write to return size of file
  return 0;
 }
}

အထက်ပါအတိုင်း၊ အင်တာဖေစ်အား ပံ့ပိုးမည့်ကလပ်စ်၏ အမည်ရဲ့နောက်တွင် implements စကားလုံးနှင့် ပံ့ပိုးမည့် အင်တာဖေစ်၏ အမည်ကို ရေးသားရပါမည်။ ဤနမှုနာတွင် အင်တာဖေစ် တစ်ခုကိုသာ အသုံးပြုထားသော်လည်း၊ အင်တာဖေစ် အမည်များကို ကော်မာခံ၍ ရေးသားသွားပါက တစ်ခုထက်မက အင်တာဖေစ်များကို ပံ့ပိုးနိုင်မည် ဖြစ်ပါသည်။ သို့ရာတွင် ကလပ်စ် အတွင်းတွင် ပံ့ပိုးထားသော အင်တာဖေစ်များတွင် သတ်မှတ်ထားသည့် လုပ်ဆောင်ချက်များကို ဖြည့်စွက် ရေးသားရန် လိုအပ်ပါသည်။


Interface များ၏ မျိုးရိုးဆက်ခံမှု့

Objected Oriented ၏ မျိုးရိုးဆက်ခံမှု့သည်လည်း အင်တာဖေစ်များတွင် အသုံးပြုနိုင်ပါသည်။ Class များတွင် အသုံးပြုခဲ့သကဲ့သို့ပင် extends ကို အသုံးပြု၍ အင်တာဖေစ်များတွင် မျိုးရိုးဆက်ခံခြင်း သဘောတရားကို အသုံးပြုနိုင်ပါသည်။ လက်တွေ့ရေးသားကြည့်ပါမည်။

ScannerTest.java
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributeView;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.List;

interface Scanner {
 public long getSize();
}

interface TextScanner extends Scanner {
 public List<String> scanLines();
}

class MyScanner implements TextScanner {

 private List<String> list;
 private long size;

 public MyScanner(String name) throws IOException {
  // Setting list
  Path path = FileSystems.getDefault().getPath(name);
  this.list = Files.readAllLines(path, Charset.defaultCharset());
  
  // Setting size
  BasicFileAttributeView view = Files.getFileAttributeView(path,
    BasicFileAttributeView.class);
  BasicFileAttributes attributes = view.readAttributes();
  this.size = attributes.size();
 }

 @Override
 public List<String> scanLines() {
  return this.list;
 }

 @Override
 public long getSize() {
  return this.size;
 }
}

public class ScannerTest {
 
 public static void main(String[] args) {
  try {
   TextScanner scanner = new MyScanner("ScannerTest.java");
   System.out.println("Size of file : " + scanner.getSize());
   System.out.println("Count of Lines : " + scanner.scanLines().size());
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

အထက်ပါ နမှုနာထဲတွင် Scanner နှင့် TextScanner ဟုအမည်ရသော အင်တာဖေစ် နှစ်ခုနှင့်၊ MyScanner ဟု အမည်ရသော ကလပ်စ် တစ်ခုတို့ပါဝင်ပါသည်။ Scanner အင်တာဖေစ်တွင် ဖတ်ယူထားသော ပမာဏကို ဖော်ပြနိုင်သည့် getSize လုပ်ဆောင်ချက်ကို ပိုင်ဆိုင်ပြီး၊ TextScanner မှာတော့ ဖတ်ယူထားသော စာကြောင်းများကို ရယူနိုင်သည့် scanLines လုပ်ဆောင်ချက်ကို ပိုင်ဆိုင်စေပြန်သည်။

တဖန် TextScanner သည် Scanner အမျိုးအစားအင်တာဖေစ် အဖြစ်အသုံးပြုလိုပါ၍ extends ကို အသုံးပြုကာ Scanner အင်တာဖေစ်၏အမွေကို ဆက်ခံစေပါသည်။ ဤနည်းအားဖြင့် TextScanner ကို အသုံးပြုပါက getSize ကော scanLines ကိုပါ အသုံးပြုနိုင်မည် ဖြစ်၏။

MyScanner ကလပ်စ်သည် TextScanner အင်တာဖေစ်ကို ပံ့ပိုးထားသော ကလပ်စ်ဖြစ်ပါသည်။ ထို့ကြောင့် TextScanner နှင့် ၎င်း၏ Super Class ဖြစ်သော Scanner တွင် သတ်မှတ်ထားသော getSize နှင့် scanLines များကို override လုပ်ကာ ဖြည့်စွက် ရေးသားရန်လိုအပ် ပါသည်။

MyScanner ၏ ကွန်စတရက်တာတွင် Java 7 ၏ Nio2 ကို အသုံးပြုကာ ဖိုင်၏ပမာဏနှင် ဖိုင်တွင်ပါဝင်သော စာကြောင်းများကို ဖတ်ယူ၍၊ private အချက်အလက်များ ဖြစ်ကြသော size နှင့် lines တွင် အစားထိုး သိမ်းဆည်း ထားပါသည်။ ဤနည်းအားဖြင့် getSize ကို ခေါ်ယူသောအခါ size ကို၎င်း၊ scanLines ကို ခေါ်ယူသောအခါ lines ကို၎င်း ပြန်ပေးမည်ဖြစ်သည်။

တဖန် ScannerTest#main လုပ်ဆောင်ချက်ထဲတွင် TextScanner အင်တာဖေစ်၏ Object ကို MyScanner ကလပ်စ်မှတဆင့် instance လုပ်ပြီး၊ စာကြောင်း ၅၁နှင့် ၅၂တွင် အသီးသီး TextScanner Object မှတဆင့် getSize နှင့် ScanLines ၏ စာကြောင်းရေကို ဖော်ပြနိုင်သော List#size ကို ခေါ်ယူနေပါသည်။ ဤနမှုနာထဲတွင် scanner.scanLines().size() ဟု ရေးသားထားသည်မှာ scanner.scanLines() ဖြင့် List Object ကို ရရှိပြီး၊ ထို List ၏ size လုပ်ဆောင်ချက်ကို ဆက်လက် ခေါ်ယူခြင်း ဖြစ်ပါသည်။

အထက်ပါ ကုဒ်များအား ကွန်ပိုင်းလုပ်ကာ Run ကြည့်ပါမည်။



ဆက်ပါဦးမည်။ လေးစားစွာဖြင့်
မင်းလွင်

No comments:

Post a Comment