# Dart Extension คืออะไร

#Dev#Dart#Flutter#Extension#Feature

เป็นอีกหนึ่งเรื่องของ Dart ที่จะรู้ไม่รู้ก็ได้ แต่รู้ไว้ก็มีความสะดวกอยู่เหมือนกัน

Header

# เบื้องต้น

สมมติว่าเรามีโค้ดหน้าตาประมาณนี้

void main() {
  var user1 = User('Intception');
  user1.sayHi();
}

// สมมติว่าเป็น class จาก Library
class User {
  String name;

  User(this.name);

  void sayHi() {
    print('Hi, my name is \'$name\'');
  }
}

จะได้ผลลัพธ์

Hi, my name is 'Intception'

ทีนี้ถ้าเราอยากให้มัน sayHi เป็นภาษาไทยแทนล่ะ โดยปกติเราจะใช้การ Inherit เอาประมาณนี้


 

 













 
 
 
 
 
 
 
 

void main() {
  var user1 = ThaiUser('Intception');
  user1.sayHi();
  user1.sayHiInThai();
}

// สมมติว่าเป็น class จาก Library
class User {
  String name;

  User(this.name);

  void sayHi() {
    print('Hi, my name is \'$name\'');
  }
}

// วิธีแบบใช้การ Inherit
class ThaiUser extends User {
  ThaiUser(String name) : super(name);

  void sayHiInThai() {
    print('สวัสดี, ฉันชื่อ \'$name\'');
  }
}

จะได้ผลลัพธ์

Hi, my name is 'Intception'
สวัสดี, ฉันชื่อ 'Intception'

ซึ่งถามว่าได้ไหม มันก็ได้นะ...แต่ว่าบาง Class ที่เขียนซับซ้อนกว่านี้ หรือมีการใช้งานเฉพาะกว่านี้ มันอาจจะบังคับให้เราใช้ User เราไม่สามารถใช้ ThaiUser ที่เรา Inherit ต่อมาได้

# มาใช้ Extension กันเถอะ

ผมสามารถเปลี่ยนจากการ Inherit ข้างบนได้ว่า


 















 
 
 
 
 
 

void main() {
  var user1 = User('Intception'); // ใช้ User เหมือนเดิม
  user1.sayHi();
  user1.sayHiInThai();
}

// สมมติว่าเป็น class จาก Library
class User {
  String name;

  User(this.name);

  void sayHi() {
    print('Hi, my name is \'$name\'');
  }
}

// วิธีแบบใช้ extension
extension on User {
  void sayHiInThai() {
    print('สวัสดี, ฉันชื่อ \'$name\'');
  }
}

จะได้ผลลัพธ์เหมือนเดิม

Hi, my name is 'Intception'
สวัสดี, ฉันชื่อ 'Intception'

อย่างที่เห็นก็คือ เราสามารถยัด Method เพิ่มลงไปใน class ที่มีอยู่แล้วได้เลย

# ใช้กับ Class พื้นฐานได้

เราสามารถใช้ extension กับพวก int, String, Object, List<> Map<> ได้ด้วยครับ เช่น

void main() {
  print(2.pow2);

  var myList = [1, 2, 3];
  print(sum(myList));
  print(myList.sum);
}

// สามารถใช้ extension กับ class พื้นฐานได้
extension on int {
  int get pow2 => this * this;
}

// ปกติถ้าเราจะ sum เราอาจจะสร้างฟังก์ชันขึ้นมาก็ได้ เช่น
int sum(List<int> list) {
  return list.fold(0, (a, b) => a + b);
}

// แต่เราสามารถทำแบบนี้ก็ได้ด้วยครับ
extension on List<int> {
  int get sum => fold(0, (a, b) => a + b);
}

จะได้ผลลัพธ์

4
6
6

สั้นๆก็มีเท่านี้ ลองไปประยุกต์ใช้กันดูนะครับ

อัปเดตเมื่อ: 1 ปีที่แล้ว