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.
Görev
KolayArayü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 birDescriberyöntemine sahip birDescribe() stringarayüzü tanımla. Ardından bu arayüzü uygulayan iki yapı oluştur:Car;BrandveModelalanlarına sahip (ikisi de string)Bicycle;Type(string) veGears(int) alanlarına sahip
Describe()yöntemi olmalıdır.main.go: Herhangi birPrintDescriptionkabul eden veDescriberyönteminin çağrılması sonucunu yazdıranDescribe()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 gearsTemel çı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
}
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 PoolKendi başına pratik yap: Online Go derleyicisi