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

# เบื้องต้น
สมมติว่าเรามีโค้ดหน้าตาประมาณนี้
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
สั้นๆก็มีเท่านี้ ลองไปประยุกต์ใช้กันดูนะครับ