Sobes.tech
Middle

Jak wygląda model obiektowy w Go?

sobes.tech AI

Odpowiedź od AI

W Go nie ma tradycyjnego modelu obiektowego z głęboką hierarchią dziedziczenia klas. Zamiast tego używa się:

  • Struktury (Structs): Definiują pola danych, podobnie jak klasy bez metod.

    type Person struct {
        Name string
        Age  int
    }
    
  • Metody: Funkcje powiązane z określoną strukturą. Są definiowane oddzielnie od struktury.

    func (p Person) Greet() string {
        return "Cześć, nazywam się " + p.Name
    }
    
    func (p *Person) CelebrateBirthday() {
        p.Age++
    }
    
    • Metody z odbiornikiem wartości (np. (p Person)) pracują na kopii struktury.
    • Metody z odbiornikiem wskaźnikowym (np. (p *Person)) pracują na oryginale struktury, umożliwiając modyfikację jej pól.
  • Interfejsy: Zbiory sygnatur metod. Typy implementujące wszystkie metody interfejsu niejawnie spełniają ten interfejs. To jest podstawa polimorfizmu w Go.

    type Greeter interface {
        Greet() string
    }
    
    // Person niejawnie implementuje Greeter
    
  • Kompozycja (Wbudowanie): Zamiast dziedziczenia, jedna struktura może wbudować inną strukturę, uzyskując dostęp do jej pól i metod.

    type Employee struct {
        Person // Wbudowujemy strukturę Person
        ID     string
    }
    
    func (e Employee) GetID() string {
        return e.ID
    }
    

    Wbudowane pola i metody są dostępne bezpośrednio:

    e := Employee{
        Person: Person{Name: "Alice", Age: 30},
        ID:     "E123",
    }
    fmt.Println(e.Name)     // Dostęp do pola Name przez wbudowaną Person
    fmt.Println(e.Greet())  // Wywołanie metody Greet przez wbudowaną Person
    fmt.Println(e.GetID())  // Wywołanie metody Employee
    

W ten sposób, model obiektowy w Go opiera się na kompozycji struktur i zachowaniu określonym przez interfejsy, a nie na klasycznej hierarchii dziedziczenia klas.