Sobes.tech
Middle+

Confronta l'implementazione della programmazione orientata agli oggetti in Go e C#.

sobes.tech AI

Risposta dell'AI

In Go non esiste l'ereditarietà classica orientata agli oggetti né classi nel senso tradizionale. Al suo posto, Go utilizza composizione e interfacce.

Principali differenze:

  • Classi e oggetti: C# si basa sulle classi, da cui si creano oggetti. Go utilizza strutture (structs), che possono avere metodi.
  • Ereditarietà: C# supporta ereditarietà semplice e multipla (tramite interfacce). Go supporta composizione (inclusione di strutture) e polimorfismo tramite interfacce.
  • Interfacce: In C# le interfacce devono essere implementate esplicitamente dalla classe. In Go, le interfacce sono implementate implicitamente: se una struttura ha metodi che corrispondono alla firma dell'interfaccia, la implementa automaticamente.
  • Visibilità (Modificatori di accesso): In C# si usano public, private, protected, internal. In Go, la visibilità è determinata dalla prima lettera del nome: maiuscola, pubblico; minuscola, privato (all'interno del pacchetto).
  • Generici: C# ha un sistema avanzato di generici. Go ha aggiunto il supporto ai generici a partire dalla versione 1.18.

Esempio di composizione in Go:

package main

import "fmt"

type Engine struct {
	Type string
}

func (e Engine) Start() {
	fmt.Printf("%s engine started!\n", e.Type)
}

type Car struct {
	Model string
	Engine // Inclusione anonima - composizione
}

func main() {
	myCar := Car{
		Model: "Sedan",
		Engine: Engine{
			Type: "Petrol",
		},
	}
	fmt.Printf("Car model: %s\n", myCar.Model)
	myCar.Start() // Chiamata al metodo della struttura incorporata
}

Esempio di implementazione di interfaccia in Go:

package main

import "fmt"

type Speaker interface {
	Speak() string
}

type Dog struct{}

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

type Cat struct{}

func (c Cat) Speak() string {
	return "Meow!"
}

func main() {
	animals := []Speaker{Dog{}, Cat{}} // Slice di tipi che implementano l'interfaccia Speaker
	for _, animal := range animals {
		fmt.Println(animal.Speak())
	}
}

Nella tabella:

Caratteristica Go C#
Classi No (strutture)
Oggetti Istanze di strutture Istanza di classi
Ereditarietà Composizione, interfacce Classica (semplice), interfacce
Interfacce Implementazione implicita Implementazione esplicita
Visibilità Prima lettera maiuscola public, private, protected, ecc.
Generici Dalla versione 1.18

L'approccio di Go alla OOP è più decentralizzato e focalizzato sul comportamento (tramite interfacce) e sulla struttura dei dati (tramite inclusione), il che spesso porta a codice più flessibile e facilmente testabile. C# segue un modello più tradizionale e gerarchico.