Menu
Coddy logo textTech

Arayüzlere Giriş

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

Go'da bir arayüz, yöntem imzalarını uygulamadan tanımlar. Bir türün bunu nasıl yaptığını değil, neler yapabileceğini açıklar. Bir arayüzdeki tüm yöntemleri uygulayan her tür, otomatik olarak o arayüzü karşılar.

Bir arayüzü şu şekilde tanımlarsınız:

type Speaker interface {
    Speak() string
}

Bu Speaker arayüzü, onu uygulayan herhangi bir türün string döndüren bir Speak() metoduna sahip olmasını gerektirir. Artık bu metoda sahip herhangi bir struct, Speaker beklenen her yerde kullanılabilir.

type Dog struct {
    Name string
}

func (d Dog) Speak() string {
    return d.Name + " says woof!"
}

type Cat struct {
    Name string
}

func (c Cat) Speak() string {
    return c.Name + " says meow!"
}

Hem Dog hem de Cat, doğru imzaya sahip birer Speak() yöntemine sahip oldukları için Speaker arayüzünü karşılar. Artık herhangi bir Speaker kabul eden işlevler yazabilirsiniz:

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

func main() {
    dog := Dog{Name: "Buddy"}
    cat := Cat{Name: "Whiskers"}
    
    MakeSound(dog)  // Buddy hav diyor!
    MakeSound(cat)  // Whiskers miyav diyor!
}

Arayüzler, temelindeki uygulamadan bağımsız olarak, arayüzün gereksinimlerini karşılayan herhangi bir türle çalışan esnek ve yeniden kullanılabilir kod yazmanızı sağlar.

challenge icon

Görev

Kolay

Arayüzlerin farklı türlerin ortak davranışları paylaşmasına nasıl olanak tanıdığını gösteren bir araç açıklama sistemi oluşturalım. Birden fazla araç türünün uygulayabileceği bir arayüz oluşturacak, ardından bunu herhangi bir aracı aynı şekilde açıklamak için kullanacaksın.

Kodunu iki dosya arasında düzenleyeceksin:

  • vehicles.go: Tek bir Describer yöntemine sahip bir Describe() string arayüzü tanımla. Ardından bu arayüzü uygulayan iki yapı oluştur:
    • Car; Brand ve Model alanlarına sahip (ikisi de string)
    • Bicycle; Type (string) ve Gears (int) alanlarına sahip
    Her yapının araç hakkında açıklayıcı bir dize döndüren bir Describe() yöntemi olmalıdır.
  • main.go: Herhangi bir PrintDescription kabul eden ve Describer yönteminin çağrılması sonucunu yazdıran Describe() adlı bir işlev oluştur. Araç bilgilerini girdiden oku, bir Car ve bir Bicycle oluştur ve her biri için açıklamaları yazdırmak üzere işlevini kullan.

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

  • 1. satır: Car markası
  • 2. satır: Car modeli
  • 3. satır: Bicycle türü
  • 4. satır: Vites sayısı (tam sayı)

Describe() yöntemlerin şu biçimlerde dizeler döndürmelidir:

  • Car: [Brand] [Model]
  • Bicycle: [Type] bike with [Gears] gears

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

Toyota Camry
Mountain bike with 21 gears

Temel çıkarım şudur: PrintDescription işlevin, Describe() yöntemine sahip herhangi bir türle çalışır. Bir Car, Bicycle veya daha sonra ekleyebileceğin başka bir araç türüyle çalışıp çalışmadığını bilmesine gerek yoktur.

Kendin dene

package main

import (
	"fmt"
)

// TODO: Herhangi bir Describer kabul eden bir PrintDescription fonksiyonu oluştur
// ve Describe() metodunu çağırarak sonucunu yazdırır

func main() {
	// Girdiyi oku
	var carBrand string
	var carModel string
	var bicycleType string
	var gears int

	fmt.Scanln(&carBrand)
	fmt.Scanln(&carModel)
	fmt.Scanln(&bicycleType)
	fmt.Scanln(&gears)

	// TODO: Girdiden marka ve model ile bir Car oluştur

	// TODO: Girdiden tip ve viteslerle bir Bicycle oluştur

	// TODO: Arabanın açıklamasını yazdırmak için PrintDescription kullan

	// TODO: Bisikletin açıklamasını yazdırmak için PrintDescription kullan
}
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