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'daki bir interface, metot imzalarını bunları uygulamadan tanımlar. Bir type'ın ne yapabileceğini açıklar, nasıl yapacağını değil. Bir interface'deki tüm metotları uygulayan herhangi bir type, otomatik olarak o interface'i karşılar.

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

type Speaker interface {
    Speak() string
}

Bu Speaker arayüzü, uygulayan her türün string döndüren bir Speak() metoduna sahip olmasını gerektirir. Artık bu metoda sahip olan herhangi bir struct, bir 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, her birinin doğru imzaya sahip bir Speak() metodu olduğu için Speaker arayüzünü karşılar. Artık herhangi bir Speaker kabul eden fonksiyonlar 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, temel uygulamadan bağımsız olarak, arayüzün gereksinimlerini karşılayan her türle çalışan esnek ve yeniden kullanılabilir kodlar yazmanıza olanak tanır.

challenge icon

Görev

Kolay

Arayüzlerin (interfaces) farklı türlerin ortak davranışları paylaşmasına nasıl izin verdiğini gösteren bir araç açıklama sistemi oluşturalım. Birden fazla araç türünün karşılayabileceği bir arayüz oluşturacak ve ardından bunu herhangi bir aracı tek tip bir şekilde tanımlamak için kullanacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • vehicles.go: Tek bir Describe() string metoduna sahip bir Describer arayüzü tanımlayın. Ardından bu arayüzü karşılayan iki yapı (struct) oluşturun:
    • Brand ve Model alanlarına (her ikisi de string) sahip Car
    • Type (string) ve Gears (int) alanlarına sahip Bicycle
    Her yapı, araç hakkında açıklayıcı bir dize döndüren bir Describe() metoduna sahip olmalıdır.
  • main.go: Herhangi bir Describer kabul eden ve onun Describe() metodunu çağırmanın sonucunu yazdıran PrintDescription adında bir fonksiyon oluşturun. Girdiden araç bilgilerini okuyun, hem bir Car hem de bir Bicycle oluşturun ve her biri için açıklamaları yazdırmak üzere fonksiyonunuzu kullanın.

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

  • Satır 1: Araba markası (Car brand)
  • Satır 2: Araba modeli (Car model)
  • Satır 3: Bisiklet türü (Bicycle type)
  • Satır 4: Vites sayısı (tamsayı)

Describe() metodlarınız şu formatlarda dizeler döndürmelidir:

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

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

Toyota Camry
Mountain bike with 21 gears

Buradaki temel nokta, PrintDescription fonksiyonunuzun Describe() metoduna sahip olan her türle çalışabilmesidir; bir Car, Bicycle veya daha sonra ekleyebileceğiniz başka bir araç türüyle mi uğraştığını bilmesine gerek yoktur.

Kopya kağıdı

Go'da bir interface (arayüz), yöntem imzalarını bunları uygulamadan tanımlar. Tüm yöntemleri uygulayan herhangi bir tür, o arayüzü otomatik olarak karşılar.

Bir arayüz tanımlama:

type Speaker interface {
    Speak() string
}

Gerekli yöntemleri uygulayan türler arayüzü karşılar:

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!"
}

Fonksiyonlar, arayüzü karşılayan herhangi bir türü kabul edebilir:

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

func main() {
    dog := Dog{Name: "Buddy"}
    cat := Cat{Name: "Whiskers"}
    
    MakeSound(dog)  // Buddy says woof!
    MakeSound(cat)  // Whiskers says meow!
}

Kendin dene

package main

import (
	"fmt"
)

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

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 alınan marka ve model ile bir Car oluşturun

	// TODO: Girdiden alınan tip ve vites (gears) ile bir Bicycle oluşturun

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

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