0Pricing
Go Academy · Lekcja

Promowanie metod

Dziedzicz metody przez osadzanie

Promowanie metod to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Dziedziczenie metod przez osadzanie

Po osadzeniu typu promowane są również jego metody. Typ zewnętrzny może wywoływać je tak, jakby sam je definiował — to odmiana dziedziczenia w Go.

Promowana metoda

Car osadza Engine i automatycznie zyskuje jego metodę Start.

package main

import "fmt"

type Engine struct{}

func (Engine) Start() { fmt.Println("engine started") }

type Car struct{ Engine }

func main() {
	c := Car{}
	c.Start()
}

Metody działają na osadzonej wartości

Promowana metoda działa na osadzonym polu, a nie na zewnętrznej strukturze. Nie ma dostępu do pozostałych pól zewnętrznej struktury.

package main

import "fmt"

type Counter struct{ n int }

func (c *Counter) Inc() { c.n++ }
func (c Counter) Get() int { return c.n }

type Widget struct{ Counter }

func main() {
	w := Widget{}
	w.Inc()
	w.Inc()
	fmt.Println(w.Get())
}

Przesłanianie metody

Należy zdefiniować metodę o tej samej nazwie w zewnętrznej strukturze, aby przesłonić promowaną metodę. Metoda zewnętrzna ma pierwszeństwo.

package main

import "fmt"

type Animal struct{}

func (Animal) Speak() string { return "..." }

type Dog struct{ Animal }

func (Dog) Speak() string { return "Woof" }

func main() {
	fmt.Println(Dog{}.Speak())
}

Wywoływanie wersji osadzonej

Nawet po przesłonięciu można nadal uzyskać dostęp do oryginalnej metody za pomocą nazwy osadzonego typu.

package main

import "fmt"

type Animal struct{}

func (Animal) Speak() string { return "generic" }

type Dog struct{ Animal }

func (d Dog) Speak() string { return "Woof + " + d.Animal.Speak() }

func main() {
	fmt.Println(Dog{}.Speak())
}

Promowanie a interfejsy

Ponieważ promowane metody należą do zbioru metod typu zewnętrznego, typ zewnętrzny może spełniać wymagania interfejsów dzięki metodom osadzonego typu.

package main

import "fmt"

type Stringer interface{ String() string }
type Base struct{ name string }

func (b Base) String() string { return b.name }

type Wrapper struct{ Base }

func main() {
	var s Stringer = Wrapper{Base{"hi"}}
	fmt.Println(s.String())
}

Zbiory metod wskaźnika i wartości

Jeśli osadzony typ ma metody z odbiorcą wskaźnikowym, tylko wskaźnik do zewnętrznej struktury (lub adresowalna wartość) otrzymuje te promowane metody w swoim zbiorze metod.

Osadzanie w celu zapewnienia domyślnego zachowania

Należy osadzić typ udostępniający rozsądne metody domyślne, a następnie przesłonić tylko te nieliczne, które wymagają dostosowania — to potężny wzorzec ponownego użycia.

package main

import "fmt"

type DefaultHandler struct{}

func (DefaultHandler) Handle() string { return "default" }

type CustomHandler struct{ DefaultHandler }

func (CustomHandler) Handle() string { return "custom" }

func main() {
	fmt.Println(CustomHandler{}.Handle())
}

Brak prawdziwego polimorfizmu

W przeciwieństwie do klasycznego OOP osadzona metoda nie wywołuje z powrotem przesłonięcia zewnętrznego. Go nie obsługuje wirtualnego wysyłania metod przez osadzanie.

Promowanie przez wiele poziomów

Metody są promowane przechodnio: jeśli A osadza B, a B osadza C, A również zyskuje metody C, o ile nie występuje niejednoznaczność.

Kiedy promowanie pomaga

  • Ponowne używanie zachowania bez przepisywania kodu
  • Udostępnianie wartości domyślnych, które można przesłonić
  • Spełnianie wymagań interfejsów za pomocą osadzonych metod

Szybki test

Proszę sprawdzić swoją wiedzę o promowaniu metod.

Podsumowanie

Poznali Państwo promowanie metod.

  • Osadzone metody są promowane do zewnętrznego typu
  • Metody zewnętrzne przesłaniają promowane metody
  • Do oryginalnej metody można uzyskać dostęp przez nazwę osadzonego typu
  • Promowanie pomaga spełniać wymagania interfejsów, ale nie zapewnia wirtualnego wysyłania metod

Często zadawane pytania

Czy lekcja „Promowanie metod” jest bezpłatna?

Tak — pełny tekst „Promowanie metod” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Promowanie metod”?

Dziedzicz metody przez osadzanie Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Go Academy?

Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Promowanie metod”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?

Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Osadzanie struktur
  2. Osadzanie interfejsów
  3. Promowanie metod
  4. Kompozycja zamiast dziedziczenia
← Powrót do Go Academy