Menu
Coddy logo textTech

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, birden fazla yapıyı tek bir yapı içine yerleştirmenize ve farklı kaynaklardaki davranışları birleştirmenize 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ürdeki yöntemlere erişebiliyor:

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

Birden fazla struct gömerken, iki gömülü türün aynı ada sahip yöntemleri varsa adlandırma çakışması meydana gelebilir. 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, tür adını niteleyici olarak kullanarak hangi gömülü türün yöntemini çağırmak istediğinizi açıkça belirtmelisiniz.

challenge icon

Görev

Kolay

Struct gömme yoluyla birden fazla özelliği birleştiren 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 üç dosya arasında düzenleyeceksin:

  • controllers.go: Farklı özellikler sağlayan iki bağımsız denetleyici struct'ı oluştur:
    • Bir LightController; Brightness alanına (int) ve LightController değerini döndüren SetLight(level int) string metoduna sahip olmalı
    • Bir AudioController; Volume alanına (int) ve Volume değerini döndüren SetVolume(level int) string metoduna sahip olmalı
    Her iki denetleyici de bir Status() string metoduna sahip olmalı. Bu, çözmen gereken bir adlandırma çakışması oluşturur. LightController.Status() Brightness değerini, AudioController.Status() ise Volume değerini döndürmelidir.
  • device.go: Bir Name alanına sahip ve hem LightController hem de AudioController türlerini gömen bir SmartDevice struct'ı oluştur. Her iki denetleyicinin durumuyla birlikte cihaz adını 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 çöz.
  • main.go: Cihaz yapılandırmasını girdiden oku, bir SmartDevice oluştur, ışık ve ses düzeylerini ayarlamak için terfi ettirilen metotları kullan, ardından tam durumu görüntüle.

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 terfi ettirilen metotlardır) yazdır, ardından tam durumu yazdır.

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

Light set to 75%
Volume set to 60%
Living Room Hub - Brightness: 75%, Volume: 60%

SetLight ve SetVolume metotlarının metot terfisi yoluyla SmartDevice üzerinde doğrudan erişilebilir olduğuna, ancak her iki gömülü türde de bu metot bulunduğundan Status() metodunun açık niteleme gerektirdiğine dikkat et.

Kendin dene

package main

import (
	"fmt"
)

func main() {
	// Girişi 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