Goder

Sample [TR] : GOLang ile Inheritance ve Interface Kullanımı

Introduction

Cihan Özhan

Cihan Özhan

Hakkımda bilgi içeren blog sayfam; http://www.cihanozhan.com/cihan-ozhan/


LATEST POSTS

Sample [TR] : GOLang ile Metot ve İç İçe Struct Kullanımı 30th October, 2016

Sample [TR] : GOLang ile Struct Kullanımı 30th October, 2016

Sample

Sample [TR] : GOLang ile Inheritance ve Interface Kullanımı

Posted on .

Merhabalar,

GOLang dili diğer gelişmiş programlama dillerine göre daha kısıtlı imkanlar verir. Bunun bir çok nedeni vardır ancak temel prensip performanstır! GO dili geliştiricilerinin, diğer dillerde olan tüm özellikleri dile eklemek gibi bir düşüncesi yok, olmasın da… GO’nun amacı ve hedefi yüksek performanstır! Bu nedenle performans kriterlerine uymayan özellikler dile eklenmemelidir. Aynı şekilde GO’nun diğer bir özelliği de, diğer dillerde gerek dil gerek Framework tarafındaki yetenekler nedeniyle bir işin birden fazla yöntemi vardır. Ancak GO buna da karşı! 🙂 GO der ki; bir işin çoğunlukla bir yolu vardır… Neyse, konumuza dönecek olursak bu makalede küçük bir örnek yapacağız. Bu örnekte hem bir kalıtım hem de interface uygulayacağız.

Inheritance(Kalıtım); Geliştirdiğiniz sınıfların nesnel olabilmesini, kendi yeteneklerini(field, metod vb.) bir başka(kendisinden miras alan) sınıfa aktarması prensibidir. Genetik kalıtım olarak düşünebilirsiniz. Sarışın ve mavi gözlü anne babanın çocukları da genellikle böyle olacaktır. Bu durumun yazılımdaki karşılığıdır diye özetlenebilir.

Interface(Arayüz); Geliştirdiğiniz sınıflara şartname sunmanızı sağlar. Yani, bir çok class-struct tarafından kullanılacak nesneleriniz varsa bunları belirli kurallara göre interface altında toplayıp bu interface’den kalıtım alan nesnelerin de bu yetenekleri desteklemesini sağlayabilirsiniz.

Kalıtım ve arayüz konusu Object Oriented Programming yöntemleri içerisinde birlikte anlaşılması gereken ve bir çok detayı olan bir konudur. Farklı dillerde farklı şekillerde kullanılmaktadır. Örneğin en gelişmiş şekilde C# dilinde kullanılır. Ancak GO dili bu konuya biraz daha farklı yaklaşmıştır. Bu nedenle teorilere fazla takılmadan örneklere odaklanmakta yarar var.

Önemli Not : GOLang doğrudan kalıtımı desteklemez! Ancak, onunu yerine Composition yöntemiyle GOLang’da kalıtım uygulayabilmenizi sağlar. Composition yöntemi, struct içerisine kalıtım almak istediğiniz nesnenin referansını ‘anonymous type’ olarak ekleyerek kalıtım uygulama yöntemine denir. Bu anonymous type’lara da ’embedded type’ denir. Siz bu referans üzerinden ‘base struct’a erişerek kalıtım için gerekli nesnelere erişebilirsiniz.

Örneğimizin amacı;

Bir otomobil satışı ya da tanıtımı yapacak mini bir uygulamanın çekirdek mantığını oluşturmak. Birden fazla otomobil modeli için yapılacak uygulamanın otomobilin ortak özelliklerini Car adında bir struct’a topluyoruz. Diğer Ferrari, Lamborghini ve Mercedes markaları için özel tasarladığımız struct ise bu Car adındaki struct’ı miras alıyor. Böylece kod tekrarı yapmadan aynı yetenekleri tüm yapılara kurguluyoruz. Ayrıca Carface adıyla tanımladığımız interface ile de, tüm otomobil struct’larında bir otomobil için gerekli temel özelliklerin(çalıştır, durdur, bilgi ver) başlık bilgilerini(Run(), Stop() vb.) tanımlayarak tüm struct’ların bu başlık bilgilerinin içini doldurmasını bekliyoruz. Bonus olarak da özel üretimi olan markalar için SpecialProduction struct’ı tanımladık. Geri kalan kısımları kendiniz inceleyerek kod tamamlamaları yapıp çözmelisiniz.

package main

import (
	"fmt"
	"strconv"
)

// Tüm otomobil struct'ları için ortak özellikleri barındıran interface.
type Carface interface {
	Run() bool
	Stop() bool
	Information() string
}

// Carface interface'i için tasarladığımız ve ortak kullanılan metot.
func CarExecute(c Carface) {

	fmt.Println("\n")
	fmt.Println("Araç Bilgi; \n" + c.Information())
	fmt.Println("\n")

	msg := ""

	isRun := c.Run()
	if isRun {
		msg = "çalışıyor"
	} else {
		msg = "çalışmıyor"
	}
	fmt.Println("Araç " + msg + ".")

	isStop := c.Stop()
	if isStop {
		msg = "durdu"
	} else {
		msg = "durmuyor, fren tutmuyor"
	}
	fmt.Println("Araç " + msg + ".")
}

// Struct'lar

// Base Struct
// Tüm otomobil struct'ları için ortak base struct'tır.
type Car struct {
	Brand string
	Model string
	Color string
	Speed int
	Price float64
}

// Base Struct
// Bu "base struct'ı" sadece özel üretilen markaların(Ferrari, Lamborghini) struct'ları miras alabilir.
type SpecialProduction struct {
	Special bool
}

// Ferrari - Start

type Ferrari struct {
	Car // Struct'ı anonim olarak tanımlayarak kalıtım sağladık.
	SpecialProduction
}

func (_ Ferrari) Run() bool {
	return true
}

func (_ Ferrari) Stop() bool {
	return true
}

func (x *Ferrari) Information() string {
	ret := "\t" + x.Brand + " " + x.Model + "\n" + "\t" + "Color : " + x.Color + "\n" + "\t" + "Speed : " + strconv.Itoa(x.Speed) + "\n" + "\t" + "Price : " + strconv.FormatFloat(x.Price, 'g', -1, 64) + " Million"
	add := "Yes"
	if x.Special {
		ret += "\n" + "\t" + "Special : " + add
	}
	return ret
}

// Ferrari - End

// Lamborghini - Start

type Lamborghini struct {
	Car // Struct'ı anonim olarak tanımlayarak kalıtım sağladık.
	SpecialProduction
}

func (_ Lamborghini) Run() bool {
	return true
}

func (_ Lamborghini) Stop() bool {
	return true
}

func (x *Lamborghini) Information() string {
	ret := "\t" + x.Brand + " " + x.Model + "\n" + "\t" + "Color : " + x.Color + "\n" + "\t" + "Speed : " + strconv.Itoa(x.Speed) + "\n" + "\t" + "Price : " + strconv.FormatFloat(x.Price, 'g', -1, 64) + " Million"
	add := "Yes"
	if x.Special {
		ret += "\n" + "\t" + "Special : " + add
	}
	return ret
}

// Lamborghini - End

// Mercedes - Start

type Mercedes struct {
	Car // Struct'ı anonim olarak tanımlayarak kalıtım sağladık.
}

func (_ Mercedes) Run() bool {
	return true
}

func (_ Mercedes) Stop() bool {
	return false
}

func (x *Mercedes) Information() string {
	ret := "\t" + x.Brand + " " + x.Model + "\n" + "\t" + "Color : " + x.Color + "\n" + "\t" + "Speed : " + strconv.Itoa(x.Speed) + "\n" + "\t" + "Price : " + strconv.FormatFloat(x.Price, 'g', -1, 64) + " Million"
	return ret
}

// Mercedes - End

func main() {

	// Ferrari
	ferr := new(Ferrari)
	ferr.Brand = "Ferrari"
	ferr.Model = "F50"
	ferr.Color = "Red"
	ferr.Speed = 340
	ferr.Price = 1.4
	ferr.Special = true
	// fmt.Println(ferr.Information())

	// Özel üretimi bulunmayan marka örneği(Non SpecialProduction)
	merc := new(Mercedes)
	merc.Brand = "Mercedes"
	merc.Model = "CLX"
	merc.Color = "Black"
	merc.Speed = 290
	merc.Price = 0.4
	// fmt.Println(merc.Information())

	CarExecute(ferr)
	CarExecute(merc)
}

 

 

 

 

 

Kaynak : http://www.cihanozhan.com/golang-ile-inheritance-ve-interface-kullanimi/

İyi çalışmalar.

Cihan Özhan

Cihan Özhan

http://www.cihanozhan.com

Hakkımda bilgi içeren blog sayfam; http://www.cihanozhan.com/cihan-ozhan/

There are no comments.

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

View Comments (0) ...
Navigation