Sobes.tech
Middle+

Comparez l'implémentation de la programmation orientée objet en Go et C#.

sobes.tech IA

Réponse de l'IA

En Go, il n'y a pas d'héritage orienté objet classique ni de classes au sens traditionnel. À la place, Go utilise la composition et les interfaces.

Principales différences:

  • Classes et objets : C# est basé sur des classes, à partir desquelles on crée des objets. Go utilise des structures (structs), qui peuvent avoir des méthodes.
  • Héritage : C# supporte l'héritage simple et multiple (via interfaces). Go supporte la composition (inclusion de structures) et le polymorphisme via les interfaces.
  • Interfaces : En C#, les interfaces doivent être implémentées explicitement par la classe. En Go, les interfaces sont implémentées implicitement : si une structure possède des méthodes correspondant à la signature de l'interface, elle l'implémente automatiquement.
  • Visibilité (Modificateurs d'accès) : En C#, on utilise public, private, protected, internal. En Go, la visibilité est déterminée par la première lettre du nom : majuscule, public ; minuscule, privé (dans le paquet).
  • Génériques : C# dispose d'un système avancé de génériques. Go a ajouté le support des génériques à partir de la version 1.18.

Exemple de composition en 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 // Inclusion anonyme - composition
}

func main() {
	myCar := Car{
		Model: "Sedan",
		Engine: Engine{
			Type: "Petrol",
		},
	}
	fmt.Printf("Car model: %s\n", myCar.Model)
	myCar.Start() // Appel de la méthode de la structure intégrée
}

Exemple d'implémentation d'une interface en 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 de types implémentant l'interface Speaker
	for _, animal := range animals {
		fmt.Println(animal.Speak())
	}
}

Dans le tableau:

Caractéristique Go C#
Classes Non (structures) Oui
Objets Instances de structures Instances de classes
Héritage Composition, interfaces Héritage classique (simple), interfaces
Interfaces Implémentation implicite Implémentation explicite
Visibilité Première lettre en majuscule public, private, protected, etc.
Génériques Depuis la version 1.18 Oui

L'approche de Go pour la POO est plus décentralisée et axée sur le comportement (via interfaces) et la structure de données (via l'inclusion), ce qui conduit souvent à un code plus flexible et plus facile à tester. C# suit un modèle plus traditionnel et hiérarchique.