Sobes.tech
Middle

Hogyan valósulnak meg az objektumorientált programozás (OOP) fogalmai a Go nyelvben?

sobes.tech MI

Válasz az MI-től

A Go-ban nincsenek a más nyelvekben (Java, C++) megszokott klasszikus osztályok, öröklés és virtuális metódusok fogalmai. Az objektumorientált programozás a következő módokon valósul meg:

  • Struktúrák (Structs): Adatok (mezők) csoportosítása.
    type Person struct {
    	Name string
    	Age  int
    }
    
  • Metódusok: Függvények, amelyekhez egy társított fogadó (struktúra vagy más típus) tartozik. Lehetővé teszik, hogy a struktúrák viselkedést kapjanak.
    func (p Person) Greet() string {
    	return "Hello, my name is " + p.Name
    }
    
    • Fogadó értékkel: A metódus egy másolatával dolgozik a struktúrának. A változtatások nem befolyásolják az eredeti struktúrát.
    • Fogadó pointerrel: A metódus az eredeti struktúrát egy pointeren keresztül módosítja. A változtatások az eredeti struktúrát érintik.
  • Interfészek: Meghatároznak egy metódusszignatúrát, amelyet egy típusnak meg kell valósítania. Polimorfizmust biztosítanak "kacsa típusú" (duck typing) módon. Egy típus implicit módon valósít meg egy interfészt, ha minden metódusát megvalósítja.
    type Greeter interface {
    	Greet() string
    }
    
    func SayHello(g Greeter) string {
    	return g.Greet()
    }
    
  • Beágyazás (Embedding): Lehetővé teszi, hogy egy struktúra "beágyazzon" egy másik struktúrát vagy interfészt. Ez nem öröklődés a klasszikus értelemben, inkább kompozíció. A beágyazott struktúra névtelen mezővé válik, és a mezői, metódusai közvetlenül elérhetők az beágyazó struktúrá példányán keresztül.
    type Employee struct {
    	Person // beágyazott struktúra
    	ID string
    }
    
    // Az Employee most már rendelkezik a Name és Age mezőkkel, valamint a Greet() metódussal
    
    e := Employee{
    	Person: Person{Name: "Alice", Age: 30},
    	ID:     "E123",
    }
    fmt.Println(e.Greet()) // a Person Greet() metódusának hívása az Employee-n keresztül
    
OOP fogalom Megvalósítás Go-ban Megjegyzések
Osztályok Structok Nincs kifejezett class kulcsszó
Inkapszuláció Exportált (nagybetűs) / nem exportált (kisbetűs) mezők/metódusok Csomag szintű láthatóság ellenőrzése
Öröklődés Beágyazás (Embedding) Kompozíció a hierarchikus öröklődés helyett
Polimorfizmus Interfészek Duck typing, implicit interfész megvalósítás