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.
Görev
KolayArayü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 birDescribe() stringmetoduna sahip birDescriberarayüzü tanımlayın. Ardından bu arayüzü karşılayan iki yapı (struct) oluşturun:BrandveModelalanlarına (her ikisi de string) sahipCarType(string) veGears(int) alanlarına sahipBicycle
Describe()metoduna sahip olmalıdır.main.go: Herhangi birDescriberkabul eden ve onunDescribe()metodunu çağırmanın sonucunu yazdıranPrintDescriptionadı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 gearsBuradaki 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
}
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
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker Pool