> For the complete documentation index, see [llms.txt](https://vectormyanmar.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://vectormyanmar.gitbook.io/docs/flutter/opp.md).

# OOP

OOP မှာ အမျိုးအစား လေးမျိုးရှိတယ်။

1. Abstraction
2. Encapsulation
3. Inheritance
4. Polymorphism

## **Abstraction**&#x20;

**Abstraction** ကတော့ အလုပ်ခွဲခြားလုပ်ကိုင်ခြင်းလို့ခေါ်ပါတယ်။ သူ့အလုပ်သူ လုပ်စေတာပေါ့။ ဉပမာ - စားသောက်ဆိုင်မှာဆိုရင် ဝိတ်တာက ဝိတ်တာအလုပ်လုပ်မယ်၊ စားဖိုမှူးက စားဖိုမှုးအလုပ်ပေါ့၊ ငွေကိုင်က ငွေကိုင်အလုပ် ခွဲခြားလုပ်ကိုင်ခြင်းကိုခေါ်တာပါ။ တစ်ယောက်တည်း တစ်ခုတည်းက အကုန်လုပ်နေရင် အဆင်မပြေဘူးလေ။ တိုင်ပတ်သွားနိုင်တယ်။ ဒ့ါကြောင့် Code တွေရေးတဲ့အခါမှာလည်း Abstraction လို့ခေါ်တဲ့ Function တွေ၊ Class တွေ၊ Object တွေကို ခွဲခြားရေးသင့်ပါတယ်။

## **Encapsulation**&#x20;

**Encapsulation** ကတော့ အသေးစား ဆုံးဖြတ်ချက်တွေ ချတဲ့အပိုင်းလို့ ဆိုနိုင်ပါတယ်။ ဉပမာ - စားပွဲထိုးက စားဖိုမှုးကို ဟင်းဘယ်လိုချက်ရမယ် သွားပြောနေလို့အဆင်ပြေဘူးလေ။ ဒီတော့ စားဖိုမှုးက ဟင်းဘယ်လိုချက်မယ်၊ ဘယ်ပြင်ဆင်မလဲဆိုတာ သူကိုယ်တိုင် ဆုံးဖြတ်ချက်ချရမယ်။ ဒါ့ကြောင့်လဲ စားသောက်ဆိုင်တွေမှာ မီးဖိုချောင်ကသက်သက်ထားတာပေါ့။ Coding မှာဆိုရင်တော့ ဉပမာ မေးခွန်နဲ့အဖြေ ပေးတဲ့ App တွေ ဆိုပါစို့။ မေးခွန်းတွေအဖြေတွေ ဆုံးဖြတ်ပေးတာကို သက်ဆိုင်ရာ Function ကပဲ ဆုံးဖြတ်ပိုင်ခွင့်ပေးတာမျိုးပါ။ မဆိုင်တဲ့ Function ကနေဆုံးဖြတ်ချက် ပေးတာမျိုးက မဖြစ်သင့်ပါဘူး။&#x20;

ဒီတော့ ကျွန်တော်တို့ properties တွေကို private အနေနဲ့ သုံးစွဲရပါတယ်။ ဒီလိုသုံးစွဲဖို့ရင် properties name ရဲ့ရှေ့  underscore ထည့်ပေးရပါတယ်။&#x20;

```dart
List<Question> _questionBank = [
];
```

ဒီတော့ ကျွန်တော်တို့အနေနဲ့ private properties တွေကို အသုံးပြုဖို့ဆိုရင် Function အသစ်တစ်ခု create လုပ်ပေးရပါတယ်။ ဉပမာ -&#x20;

{% code title="quiz\_brain.dart" %}

```dart
String getQuestionNumber(int questionNumber){
    return _questionBank[quesitonNumber].questionText;
}

  bool getQuestionAnswer(int questionNumber){
    return _questionBank[questionNumber].questionAnswer;
  }
```

{% endcode %}

ဒီသင်ခန်းစာမှာဆိုရင် ကျွန်တော်တို့ app က question ကုန်သွားလည်း ထပ်ပြီး `questionNumber` ကို ပေါင်းနေတဲ့အတွက် Error result ရရှိပါတယ်။ ဒါကို fix ဖို့အတွက် main.dart file ထဲက `int questionNumber = 0;` ကို quiz\_brain.dart ဖိုင်ထဲက QuizBrain Class ထဲကိုထည့်လိုက်ပါမယ်။ ပြီးရင်တော့ သူ့ကိုလည်း private properties ပြောင်းလိုက်ပါတယ်။ `int _quesitonNumber = 0;`ဒါ့အပြင် ကျွန်တော်တို့ စောစောက ရေးထား code ကိုလည်း အောက်ပါအတိုင်းပြင်လိုက်ပါမယ်။

{% code title="quiz\_brain.dart" %}

```dart
String getQuestionNumber(){
    return _questionBank[_quesitonNumber].questionText;
}

  bool getQuestionAnswer(){
    return _questionBank[_questionNumber].questionAnswer;
  }
```

{% endcode %}

ပြီးရင်တော့ သူ့အတွက်ကျွန်တော်တို့ method တစ်ခု create လုပ်ပါမယ်။&#x20;

{% code title="quiz\_brain.dart" %}

```dart
void nextQuesiton (){
if(_questionNumber< _questionBank.length - 1){
      _questionNumber++;
    }
}
```

{% endcode %}

## **Inheritance**

Inheritance ကတော့ မျိုးရိုးဗီဇ ဇယားပုံစံ နည်းသွားဆင်ပါတယ်။ ကျွန်တော်တို့အနေနဲ့ တူညီတဲ့ properties တွေကို ထပ်ခါထပ်ခါမရေးပဲ dart မှာဆိုရင် **extends** လုပ်ပြီး အသုံးပြုလို့ရနိုင်တာပဲဖြစ်ပါတယ်။ ဉပမာ -

```dart
void main {
    //အောက်မှာရေးထားတဲ့ class ကို object အဖြစ်သုံးမယ်ဆိုရင်
    Car myNormalCar = Car();
    print(myNormalCar.numberofSeats); //ဒါဆိုရင် အောက်က class ရဲ့ properties ဖြစ်တဲ့ 5 ဆိုတဲ့ ရလဒ်ရရှိမျာပဲဖြစ်ပါတယ်။     
    
    //Inheritance အဖြစ်အသုံးပြုခြင်း
    
    ElectricCar myTesla = ElectricCar();
    myElectricCar.drive(); // ဒါဆိုရင် Car Class ရဲ့ drive method ကိုတိုက်ရိုက်သုံးစွဲလို့ရသွားမှာပဲဖြစ်ပါတယ်။
}

//car ဆိုတဲ့ class အသစ်တစ်ခု ရေးလိုက်မယ်

class Car(){
    int numberOfSeats = 5; //ဒါကတော့ properties ပဲဖြစ်ပါတယ်။
    
    void drive(){
        print('wheels start turn.'); // ဒါကတော့ method ပဲဖြစ်ပါတယ်။
    }
}

//နောက် class တစ်ခုအနေနဲ့ Inheritance အဖြစ်သုံးမယ်ဆိုရင်

class ElectricCar extends Car(){
    //Car(); class ရဲ့ properties တွေနဲ့ method တွေကို တခါတည်းရရှိသွားမှာ ဖြစ်ပါတယ်။
    //ဒ့ါအဖြစ် properties အသစ်တွေနဲ့ method အသစ်တွေကိုပါ ထည့်သွင်းအသုံးပြုလို့ရမျာဖြစ်ပါတယ်။
    
    int batteryLevel = 100;
    
    void recharge(){
    batteryLevel = 100;
}
```

## Polymorphism

Polymorphism ကတော့ custom behavior တွေ create လုပ်တဲ့နေရာမှာအသုံးပြုပါတယ်။ Inheritance လုပ်ထားတဲ့ class ကိုမှာ ကိုယ်ပိုင် style (သို့) properties တွေကို စိတ်ကြိုက် ပြင်ဆင်သုံးစွဲနိုင်ခြင်းပဲဖြစ်ပါတယ်။ ဉပမာ &#x20;

```dart
void main {
    //အောက်မှာရေးထားတဲ့ class ကို object အဖြစ်သုံးမယ်ဆိုရင်
    Car myNormalCar = Car();
    print(myNormalCar.numberofSeats); //ဒါဆိုရင် အောက်က class ရဲ့ properties ဖြစ်တဲ့ 5 ဆိုတဲ့ ရလဒ်ရရှိမျာပဲဖြစ်ပါတယ်။     
    
    //Inheritance အဖြစ်အသုံးပြုခြင်း
    
    ElectricCar myTesla = ElectricCar();
    myElectricCar.drive(); // ဒါဆိုရင် Car Class ရဲ့ drive method ကိုတိုက်ရိုက်သုံးစွဲလို့ရသွားမှာပဲဖြစ်ပါတယ်။
    
    //Polymorphism အဖြစ်အသုံးပြုခြင်း
    LevitatingCar myMagLev= LevitatingCar();
    myMagLev.drive(); // ဒါဆိုရင် Car Class ရဲ့ drive method ကိုမသုံးပဲ Polymorphism (တနည်းအားဖြင့် overwrite)လုပ်ထားတဲ့ method ကိုသုံးစွဲသွားတာ တွေ့ရမှာပဲဖြစ်ပါတယ်။
    
     //Polymorphism ကို မူရင်း Method ဖြင့်တွဲဖက်အသုံးပြုခြင်း
     //ထုံးစံအတိုင်း object တည်ဆောက်မယ်
     SelfDrivingCar myWaymo = SelfDrivingCar('1 Hacker way');//ဒီနေရာမှာ ကျွန်တော်တို့ value တစ်ခုခု input လုပ်ပေးရပါတယ်။
     
     myWaymo.drive(); //ဒီလိုခေါ်လိုက်မယ်ဆိုရင်တော့ မူရင်း method ရော customize လုပ်ထားတဲ့ method ရောပါ တွဲဖက်ဖော်ပြပေးမှာပဲဖြစ်ပါတယ်။
}
    
//car ဆိုတဲ့ class အသစ်တစ်ခု ရေးလိုက်မယ်

class Car(){
    int numberOfSeats = 5; //ဒါကတော့ properties ပဲဖြစ်ပါတယ်။
    
    void drive(){
        print('wheels start turn.'); // ဒါကတော့ method ပဲဖြစ်ပါတယ်။
    }
}

//နောက် class တစ်ခုအနေနဲ့ Inheritance အဖြစ်သုံးမယ်ဆိုရင်

class ElectricCar extends Car(){
    //Car(); class ရဲ့ properties တွေနဲ့ method တွေကို တခါတည်းရရှိသွားမှာ ဖြစ်ပါတယ်။
    //ဒ့ါအဖြစ် properties အသစ်တွေနဲ့ method အသစ်တွေကိုပါ ထည့်သွင်းအသုံးပြုလို့ရမျာဖြစ်ပါတယ်။
    
    int batteryLevel = 100;
    
    void recharge(){
    batteryLevel = 100;
}

class LevitatingCar extends Car { //Class တွေရဲ့ အစ စာကလုံးတွေဟာ အကြီးနဲ့စပါတယ်။
    //Polymorphism လုပ်ဖို့အတွက်ဆိုရင် အရင်ဆုံး overwrite လုပ်ရပါတယ်။ ဒါ့ကြောင့်
    @override
    //အဲ့ဒီနောက်မှာတော့ ကိုယ်ပိုင် style နဲ့ customize လုပ်လို့ရပြီပဲဖြစ်ပါတယ်။
    void drive(){
        print('glide forwards');
    }
}
//နောက်တစ်နည်းအသုံးပြုလို့ရတာကတော့ Parent class ရဲ့ method နဲ့ customize လုပ်ထားတဲ့ method ကို တွဲသုံးခြင်းဖြစ်ပါတယ်။

class SelfDrivingCar extends Car {
    String destination; 
    //constructor တည်ဆောက်မယ်ဆိုရင် 
    
    SelfDrivingCar (String userSetDestination){
    destination = userSetDestination;
    }
    // အဲ့ဒီနောက်မှာ overwrite လုပ်ပါမယ်။
    @override
    super.drive(); //super ကိုအသုံးပြုခြင်းအားဖြင့် overwrite လုပ်သော်လည်း မူရင်း method ပျောက်မသွားပါဘူး။

    print('sterring towards $destination'); //နောက်ထပ် method တစ်ခုကို create လုပ်လိုက်တာပဲဖြစ်ပါတယ်။
}
```
