ในบทความนี้จะยกตัวอย่างว่า object ในภาษาอย่าง Java ถูกอิมพลีเมนต์ยังใงถ้าเขียนด้วย C เราจะพูดแค่ตัวแปร this และการเอา function (method) ไปเป็นส่วนหนึ่งของ object เท่านั้น
หวังว่าจะทำให้น้องๆฝึกงานเข้าใจตัวแปร this ในจาวามากขึ้น
สมมติว่ามีคลาสจาวาแบบนี้
//Java
class Dog{
int age;
void setAge(int age){ this.age = age; }
int getAge(){ return this.age; }
}
concept นึงของ OOP คือการเอา data มารวมกับ function เพื่อให้เกิดเป็น object ที่มีพฤติกรรมและเกิด cohesion สูง
ในภาษา C เราสามารถใช้ struct เป็นส่วน data ของออบเจ็คได้และถ้าหากเราเอา function ใส่ไปใน struct เราก็จะได้ data+behavior เหมือนจาวา
#include<stdio.h>
#include<stdlib.h>
// โครงสร้างข้อมูลที่จำลอง class ในจาวา มี age และ setter/getter
struct Dog{
int age;
void (*setAge)(struct Dog* this,int age);
int (*getAge)(struct Dog* this);
};
//อิมพลีเมนเตชั่นของเมธอด setAge
//สังเกตุว่าจะมีตัวแปร this เป็นพารามิเตอร์ตัวแรกของเมธอด (เราเรียกตัวแปร this ว่า receiver parameter)
//ซึ่งในจาวาเราไม่ระบุ receiver parameter แต่ว่า compiler จะเพิ่มให้เราเอง
void setAge(struct Dog* this,int age){
this->age = age;
}
// เหมือน setAge มี receiver parameter
int getAge(struct Dog* this){
return this->age;
}
//ฟังชั่นที่เอาไว้จำลองการ new Object() ในจาวา เพื่อให้ง่าย จะฟิกค่า new Dog() ไปเลย
struct Dog* new_operator_for_dog(){
struct Dog* d = (struct Dog*) malloc(sizeof(struct Dog));
//เอา function มาเป็นเมธอดของ object ด้วย function pointer
//เรียกว่าการ binding
d->setAge = setAge;
d->getAge = getAge;
return d;
}
int main(){
//Dog d = new Dog()
struct Dog* d = new_operator(sizeof(struct Dog));
// d.setAge(10)
d->setAge(d,10); //<-- สังเกตว่าเรา explicit receiver parameter เนื่องจากตรงนี้เราจำลองไม่ได้ใน C syntax
// d.getAge()
printf("%d\n",d->getAge(d));
// ใช้เสร็จต้อง free เพราะไม่มี GC
free(d);
}
ตัวอย่างที่ชัดเจนอีกภาษาคือ Python ที่เวลาเรียกจะต้องระบุ reveiver parameter
Top comments (0)