Menu
Coddy logo textTech

Interface'ler ile Polimorfizm

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 41 / 107.

Polimorfizm, farklı türlerin ortak bir arayüz aracılığıyla tek tip olarak ele alınmasını sağlar. Go'da bu, kalıtım veya sınıf hiyerarşileri olmadan tamamen arayüzler aracılığıyla gerçekleştirilir.

Bir işlev, bir arayüz türünü parametre olarak kabul ettiğinde, bu arayüzü uygulayan herhangi bir somut tür işleve aktarılabilir. İşlevin belirli türü bilmesine gerek yoktur. Yalnızca arayüz tarafından tanımlanan davranışla ilgilenir:

type Speaker interface {
    Speak() string
}

type Dog struct{ Name string }
func (d Dog) Speak() string { return "Woof!" }

type Cat struct{ Name string }
func (c Cat) Speak() string { return "Meow!" }

func MakeSound(s Speaker) {
    fmt.Println(s.Speak())
}

Artık MakeSound, Speak() yöntemine sahip herhangi bir türle çalışır:

func main() {
    dog := Dog{Name: "Rex"}
    cat := Cat{Name: "Whiskers"}
    
    MakeSound(dog)  // Hav!
    MakeSound(cat)  // Miyav!
}

Aynı işlev çağrısı, geçirilen gerçek türe bağlı olarak farklı davranışlar üretir. Bu, polimorfizmin işleyiş hâlidir. MakeSound işlevi bir kez yazılır, ancak Speaker arayüzünü sağladıkları sürece sınırsız sayıda türle çalışır.

Bu yaklaşım kodunuzu esnek ve genişletilebilir tutar. Konuşan yeni bir tür eklemek, mevcut işlevlerde hiçbir değişiklik gerektirmez; yalnızca arayüzü uygulayın ve otomatik olarak çalışır.

challenge icon

Görev

Kolay

Polimorfizmi uygulamalı olarak gösteren bir araç açıklama sistemi oluşturalım. Ortak bir davranışı bir arayüz aracılığıyla paylaşan farklı araç türleri oluşturacak, ardından herhangi bir araçla çalışabilen tek bir işlev yazacaksın.

Kodunu iki dosyaya ayıracaksın:

  • vehicles.go: Describer metodunu gerektiren bir Describe() string arayüzü tanımla. Ardından bu arayüzü kendi yöntemleriyle uygulayan üç araç türü oluştur:
    • Car ve Brand alanlarına sahip Model. Describe() metodu Car: [Brand] [Model] değerini döndürür
    • Motorcycle ve Brand (int) alanlarına sahip EngineCC. Describe() metodu Motorcycle: [Brand] [EngineCC]cc değerini döndürür
    • Bicycle alanına sahip Type (örneğin "Mountain" veya "Road"). Describe() metodu Bicycle: [Type] değerini döndürür
  • main.go: Herhangi bir PrintDescription kabul eden ve Describer çağrısının sonucunu yazdıran Describe() adlı bir işlev oluştur. Araç bilgilerini girdiden oku, her araç türünden bir tane oluştur ve aynı işlevin üç farklı türle de çalıştığını göstermek için her birini PrintDescription işlevine aktar.

Aşağıdaki girdiler sağlanacaktır:

  • 1. satır: Car markası
  • 2. satır: Car modeli
  • 3. satır: Motorcycle markası
  • 4. satır: Motorcycle motor CC değeri (tam sayı)
  • 5. satır: Bicycle türü

Örneğin Toyota, Camry, Honda, 600 ve Mountain verildiğinde çıktın şu şekilde olmalıdır:

Car: Toyota Camry
Motorcycle: Honda 600cc
Bicycle: Mountain

PrintDescription işlevinin bir Car, Motorcycle veya Bicycle alıp almadığını bilmesine gerek olmadığına dikkat et. İşlev yalnızca Describe() çağrısını yapar ve her tür kendi benzersiz çıktısıyla yanıt verir. Polimorfizm budur: tek işlev, birden fazla davranış.

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

// TODO: Herhangi bir Describer kabul eden PrintDescription adında bir fonksiyon oluştur
// ve Describe() çağrısının sonucunu yazdırır

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Araba detaylarını oku
	carBrand, _ := reader.ReadString('\n')
	carBrand = strings.TrimSpace(carBrand)
	carModel, _ := reader.ReadString('\n')
	carModel = strings.TrimSpace(carModel)

	// Motosiklet detaylarını oku
	motoBrand, _ := reader.ReadString('\n')
	motoBrand = strings.TrimSpace(motoBrand)
	motoEngineStr, _ := reader.ReadString('\n')
	motoEngineStr = strings.TrimSpace(motoEngineStr)
	motoEngine, _ := strconv.Atoi(motoEngineStr)

	// Bisiklet detaylarını oku
	bicycleType, _ := reader.ReadString('\n')
	bicycleType = strings.TrimSpace(bicycleType)

	// TODO: Giriş değerlerini kullanarak bir Car, Motorcycle ve Bicycle oluştur

	// TODO: Polimorfizmi göstermek için her araç için PrintDescription çağır
	fmt.Println("TODO: Print vehicle descriptions")
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi