11 April 2020 · 3 min read
Inheritance Tanpa OOP

Minggu ini, DDP 2 yang merupakan matkul asdosan saya memasuki materi inheritance dan polymorphism. Materi ini membuat saya teringat akan fakta unik yang saya baca dari buku Clean Architecture karya Robert C. Marthin “Uncle Bob”. Inheritance yang merupakan salah satu pilar Object Oriented Programming (OOP) rupanya bukan merupakan monopoli oleh OOP itu sendiri. Hal ini menarik bagi saya karena bahkan saya baru tahu inheritance ketika belajar OOP. Lalu seperti apa jadinya inheritance tanpa OOP? Mari kita lihat.

Mari gunakan bahasa C sehingga menyerupai kondisi dahulu ketika bahasa yang cukup high level adalah C dan tidak mendukung OOP. Ingat bahwa enkapsulasi data di C menggunakan tipe data yang disebut struct. Jika familiar dengan struct pada C++, struct pada C sedikit berbeda, misalnya tidak bisa membuat method sehingga OOP memang tidak didukung.

Anggap kita memiliki sebuah struktur data Point. Kita memiliki sebuah fungsi distance yang dapat mengukur jarak antara dua Point.

#include <math.h>

struct Point {
  double x, y;
};

double distance(struct Point* p1, struct Point* p2) {
  double delta_x = p1->x - p2->x;
  double delta_y = p1->y - p2->y;
  return sqrt(delta_x * delta_x + delta_y * delta_y);
}

Lalu kita ingin membuat sebuah Point namun dengan nama. Mari kita buat struct NamedPoint.

struct NamedPoint {
  double x, y;
  char* name;
};

Perhatikan bahwa NamedPoint pada bahasa object-oriented seharusnya dideklarasikan inherit dari Point, namun pada contoh ini tidak dilakukan demikian karena bahasa C tidak mendukung OOP.

Dengan inheritance pada OOP, kita tahu bahwa kita dapat menggunakan method dari superclass. Pada kasus ini, kita berharap bisa menggunakan fungsi distance milik Point pada NamedPoint. Apakah bisa kita menggunakan fungsi distance pada NamedPoint? Rupanya bisa!

struct NamedPoint* makeNamedPoint(double x, double y, char* name) {
  struct NamedPoint *p = malloc(sizeof(struct NamedPoint));
  p->x = x;
  p->y = y;
  p->name = name;
  return p;
}

int main(int argc, char* argv[]) {
  struct NamedPoint* pointOne = makeNamedPoint(0, 0, "pointOne");
  struct NamedPoint* pointTwo = makeNamedPoint(3, 4, "pointTwo");
  double distOneTwo = distance((struct Point*) pointOne, (struct Point*) pointTwo);
  printf("distance=%f\n", distOneTwo);
}

Ternyata, NamedPoint bisa diubah menjadi Point! Perubahan ini disebut juga upcasting yang pada OOP tidak perlu dilakukan secara eksplisit. Upcasting ini dapat berhasil karena urutan atribut x dan y pada Point dan NamedPoint sama. Hal ini lah yang dilakukan coder untuk menggunakan inheritance sebelum bahasa object-oriented muncul.

Walau ternyata bisa melakukan inheritance, namun jelas cara ini kurang menyenangkan karena harus menjaga urutan atribut dan melakukan upcasting secara manual. Tapi tetap saja, fakta ini cukup unik karena ternyata inheritance tidak diciptakan oleh OOP. Kira-kira, OOP hanya “mengamankan” implementasi inheritance sehingga kita tidak perlu melakukan kesalahan seperti salah urutan atribut yang rentan dilakukan pada cara tradisional ini.


Sekian pos singkat nan random ini. Tentu masih banyak hal magic yang saya baru tahu dari buku ini. OOP saja bahkan masih banyak yang belum saya bahas di tulisan ini, misalnya encapsulation dan polymorphism. Silakan baca buku ini di bab 5 jika tertarik untuk belajar lebih lanjut emoji-stuck_out_tongue_closed_eyes.


#Knowledge #Coding
Related Post:
Gojek Upscale 3.0: Ready to Upscale Yourself?
Want to learn best practices of software engineering from experts in the industry? Gojek Upscale is for you. Find out what will you get by joining this great event.
Hari-hari sebagai Tech Intern di Bizzy
Keseharian saya pada saat magang sebagai software development engineer di Bizzy.

Muhammad Fairuzi Teguh © 2018 - 2021