Menu
CoddyTech

Birden Fazla Struct Gömme

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

Go, farklı kaynaklardan gelen davranışları birleştirerek tek bir yapının içine birden fazla yapı gömmenize olanak tanır. Bu, diğer dillerdeki çoklu kalıtıma benzer; ancak Go’nun bileşim yaklaşımını kullanır.

type Logger struct{}

func (l Logger) Log(msg string) string {
    return "LOG: " + msg
}

type Notifier struct{}

func (n Notifier) Notify(msg string) string {
    return "NOTIFY: " + msg
}

type Service struct {
    Name string
    Logger
    Notifier
}

Service yapısı artık her iki gömülü türün yöntemlerine de erişebiliyor:

func main() {
    s := Service{Name: "OrderService"}
    fmt.Println(s.Log("started"))      // LOG: started
    fmt.Println(s.Notify("new order")) // NOTIFY: new order
}

Birden fazla yapıyı gömerken, gömülü iki türün aynı ada sahip yöntemleri varsa ad çakışması oluşabilir. Go bu belirsizliği otomatik olarak çözmez:

type A struct{}
func (A) Greet() string { return "Hello from A" }

type B struct{}
func (B) Greet() string { return "Hello from B" }

type Combined struct {
    A
    B
}

func main() {
    c := Combined{}
    // c.Greet() - derleme hatası: belirsiz seçici
    fmt.Println(c.A.Greet())  // Hello from A
    fmt.Println(c.B.Greet())  // Hello from B
}

Çakışmalar ortaya çıktığında, çağırmak istediğin gömülü türün yöntemini tür adını niteleyici olarak kullanarak açıkça belirtmelisin.

challenge icon

Görev

Kolay

Struct gömme yoluyla birden fazla özelliği bir araya getiren bir akıllı ev cihazı sistemi oluşturalım. Ayrı denetleyici türlerini gömerek hem aydınlatmayı kontrol edebilen hem de müzik çalabilen bir cihaz oluşturacaksın.

Kodunu üç dosyaya ayıracaksın:

  • controllers.go: Farklı özellikler sağlayan, birbirinden bağımsız iki denetleyici struct'ı oluştur:
    • Brightness alanı (int) ve Light set to [level]% değerini döndüren SetLight(level int) string metoduna sahip bir LightController
    • Volume alanı (int) ve Volume set to [level]% değerini döndüren SetVolume(level int) string metoduna sahip bir AudioController
    Her iki denetleyicide de Status() string metodu bulunmalı. Bu, çözmen gereken bir adlandırma çakışması oluşturur. LightController.Status() Brightness: [Brightness]% değerini, AudioController.Status() ise Volume: [Volume]% değerini döndürmelidir.
  • device.go: Name alanına sahip ve hem LightController hem de AudioController türlerini gömen bir SmartDevice struct'ı oluştur. Cihaz adını her iki denetleyicinin durumuyla birlikte döndüren FullStatus() string adlı bir metot ekle; belirsizliği, gömülü her türün Status() metodunu açıkça çağırarak gider.
  • main.go: Girdi üzerinden cihaz yapılandırmasını oku, bir SmartDevice oluştur, ışık ve ses düzeylerini ayarlamak için yükseltilmiş metotları kullan, ardından tam durumu göster.

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

  • 1. satır: Cihaz adı
  • 2. satır: Başlangıç parlaklık düzeyi (tamsayı)
  • 3. satır: Başlangıç ses düzeyi (tamsayı)
  • 4. satır: Ayarlanacak yeni parlaklık düzeyi (tamsayı)
  • 5. satır: Ayarlanacak yeni ses düzeyi (tamsayı)

FullStatus() metodun şunu döndürmelidir:

[Name] - [LightController.Status()], [AudioController.Status()]

SetLight ve SetVolume çağrılarının sonuçlarını (gömülü türlerden yükseltilen metotlardır) yazdır, ardından tam durumu yazdır.

Örneğin, Lounge, 50, 30, 75 ve 60 verildiğinde çıktın şöyle olmalıdır:

Light set to 75%
Volume set to 60%
Lounge - Brightness: 75%, Volume: 60%

SetLight ve SetVolume metotlarının, metot yükseltme yoluyla doğrudan SmartDevice üzerinde kullanılabildiğine; ancak her iki gömülü türde de bu metot bulunduğundan Status() metodunun açıkça nitelenmesi gerektiğine dikkat et.

Kendin dene

package main

import (
	"fmt"
)

func main() {
	// Girdiyi oku
	var name string
	fmt.Scanln(&name)

	var initialBrightness int
	fmt.Scanln(&initialBrightness)

	var initialVolume int
	fmt.Scanln(&initialVolume)

	var newBrightness int
	fmt.Scanln(&newBrightness)

	var newVolume int
	fmt.Scanln(&newVolume)

	// TODO: Verilen ad ve başlangıç değerleriyle bir SmartDevice oluştur

	// TODO: Yükseltilmiş SetLight metodunu kullan ve sonucu yazdır

	// TODO: Yükseltilmiş SetVolume metodunu kullan ve sonucu yazdır

	// TODO: FullStatus() metodunu kullanarak tam durumu yazdır
}
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