DEV Community

Pramoth Suwanpech
Pramoth Suwanpech

Posted on

OOP in C (data+function+receiver parameter)

ในบทความนี้จะยกตัวอย่างว่า 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; }
}
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

ตัวอย่างที่ชัดเจนอีกภาษาคือ Python ที่เวลาเรียกจะต้องระบุ reveiver parameter

Top comments (0)