Golang: Catatan belajar OOP dengan GO language


Source code di sini

Struct pada Golang adalah kumpulan dari fields dan atau properties. Struct berbeda dengan Class pada Java misalnya, karena salah satunya Struct pada Go menggunakan Composition bukan inheritance yaitu dengan meng-compose sebuah struct di struct lainnya sehingga fields dan atau properties dari sebuat struct ada di dalam struct lain yang meng-embed struct tersebut.

Composition atau juga bisa di sebut embedding bisa dikatakan sebagai pengganti penggunaan inheritance di GO ,  untuk menjadikan gambaran yang lebih jelas saya mencoba mempraktekan perilaku tersebut dalam beberapa baris bahasa GO di bawah ini, selain Composition/embedding disini juga terdapat penggunaan interface sederhana, berikut kodenya:


package main

import (
	f "fmt"
	s "strconv"
)

// 1. Manusia pada umumnya
type Manusia struct {
	nama                     string
	umur                     int
	telepon, hanphone, email string
}

// 2. Manusia berstatus Mahasiswa
type Mahasiswa struct {
	Manusia       // Embed Manusia / semacam extend di OOP Java
	kampus, kosan string
	uang_jajan    float32
}

// 3. Mahasiswa berstatus Karyawan
type Karyawan struct {
	Manusia            // Embed Manusia / semacam extend di OOP Java
	perusahaan, asrama string
	salary             float32
}

// Semua manusia pasti makan
func (m Manusia) makan(makanan string) {
	f.Printf("Makan: %s \n", makanan)
}

// Semua manusia pasti minum
func (m Manusia) minum(minuman string) {
	f.Printf("Minum: %s \n", minuman)
}

// Semua mahasiswa pasti ujian
func (m Mahasiswa) ujian(mata_kuliah string) {
	f.Printf("Ujian mata kuliah: %s \n", mata_kuliah)
}

// Semua karyawan pasti gajian
func (k Karyawan) gajian() {
	f.Printf("Gajian: $.%e ", k.salary)
}

// Interfaces untuk yang pelajar
type Pelajar interface {
	makan(makanan string)
	minum(minuman string)
	ujian(mata_kuliah string)
}

type Pekerja interface {
	makan(makanan string)
	minum(minuman string)
	gajian()
}

// Fungsi Di luar interface / ga ada di interface
func (m *Manusia) bikinHoax() {
	f.Printf(m.nama + " Bikin berita Hoax biar kacau...... ")
}

// Main function
func main() {
	f.Println(`بِسْــــــــــــــــــمِ اللهِ الرَّحْمَنِ الرَّحِيْمِ`)

	// Implementasi Struct di atas adalah sebagai berikut

	// 1. Mahasiswa
	joni := Mahasiswa{Manusia{"Joni", 20, "0214353454", "098342342", "jonni@example.com"}, "Prapatan University", "Kosan ibu Nuri", 200}
	var joni_mahasiswa Pelajar // Interface
	f.Println(`Nama:` + joni.nama)
	f.Println(`Nama:` + s.Itoa(joni.umur))
	f.Println(`Nama:` + joni.telepon)
	f.Println(`Nama:` + joni.hanphone)
	f.Println(`Nama:` + joni.email)

	joni_mahasiswa = joni
	joni_mahasiswa.makan(`Nasi padang`)
	joni_mahasiswa.minum(`Es Campur`)
	joni_mahasiswa.ujian(`Sastra Rusia`)
	// Kalo tidak di komen fungsi di bawah akan ada error: joni_mahasiswa.bikinHoax undefined (type Pelajar has no field or method bikinHoax)
	// joni_mahasiswa.bikinHoax() // Ya iya lah masa Mahasiswa bikin Hoax, bego di piara mah ga usah kuliah...
	joni.bikinHoax() //Joni sebagai manusia bisa khilaf, jadi ini akan jalan

	f.Println(``)
	f.Println(`------------------------`)
	f.Println(``)

	// 2. Karyawan
	kokom := Karyawan{Manusia{"Kokom Komariyah", 27, "02199999", "0888902343", "kokok-cute@example.com"}, "PT. Telekokom Tbbek", "Rumah dinas Telekokom", 20000}
	var kokom_karyawan Pekerja // Interface
	f.Println(`Nama:` + kokom.nama)
	f.Println(`Nama:` + s.Itoa(kokom.umur))
	f.Println(`Nama:` + kokom.telepon)
	f.Println(`Nama:` + kokom.hanphone)
	f.Println(`Nama:` + kokom.email)

	kokom_karyawan = kokom
	kokom_karyawan.makan(`Steak Kerbau Buleng`)
	kokom_karyawan.minum(`Vodka Bridenk`)
	kokom_karyawan.gajian()
	f.Println(``)
	// Kalo tidak di komen fungsi di bawah akan ada error: kokom_karyawan.bikinHoax undefined (type Pelajar has no field or method bikinHoax)
	// kokom_karyawan.bikinHoax() // masa Professional bikin Hoax...
	kokom.bikinHoax() //Kokom sebagai manusia bisa khilaf, jadi ini jalan
	f.Println(``)
	f.Println(`----------------------------
	f.Println(``)
	// Manusia biasa
	manusia := Manusia{"Entahlah", 27, "02100", "08000", "teuing@ex.com"}
	f.Println(`Nama:` + manusia.nama)
	f.Println(`Nama:` + s.Itoa(manusia.umur))
	f.Println(`Nama:` + manusia.telepon)
	f.Println(`Nama:` + manusia.hanphone)
	f.Println(`Nama:` + manusia.email)
	manusia.bikinHoax() // Wajar namanya manusia
}

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s