Sobes.tech
Junior

Was sind die Gemeinsamkeiten und Unterschiede zwischen einer normalen und einer abstrakten Klasse?

sobes.tech KI

Antwort von AI

In Golang gibt es kein Konzept von "normaler Klasse" und "abstrakter Klasse" in der Form, wie sie in objektorientierten Sprachen wie Java oder C# existieren.

Allerdings kann ihre Funktionalität durch die Verwendung von Strukturen und Schnittstellen nachgeahmt werden.

Ähnlichkeiten (unter Verwendung von Strukturen und Schnittstellen in Golang):

  • Zustand (Daten): Die Struktur kann Felder enthalten, ähnlich wie eine normale Klasse Eigenschaften speichert.
  • Verhalten (Methoden): Methoden können an die Struktur angehängt werden, die ihr Verhalten definieren, ähnlich wie Methoden einer normalen Klasse.
  • Gemeinscher Vertrag (für abstrakte Klasse und Schnittstelle): Die Schnittstelle in Golang definiert eine Reihe von Methoden, die jede "implementierende" Struktur bereitstellen muss. Das ist vergleichbar mit einer abstrakten Klasse oder Schnittstelle in anderen Sprachen, die einen Vertrag für Erben oder Implementierende festlegt.

Unterschiede (im Kontext von Golang):

Merkmal "Normale Klasse" (Struktur mit Methoden) "Abstrakte Klasse" (Schnittstelle + Strukturen)
Direkte Erstellung Es ist möglich, eine Instanz der Struktur zu erstellen. Es ist nicht möglich, eine Instanz der Schnittstelle zu erstellen.
Implementierung von Methoden Alle Methoden, die an die Struktur angehängt sind, haben eine Implementierung. Die Schnittstelle deklariert nur Methoden, aber nicht deren Implementierung.
Vererbung Es gibt keine explizite Vererbung im klassischen Sinne. Komposition (Einschluss von Strukturen) kann verwendet werden. Die Schnittstelle erbt nicht, sondern wird von Strukturen implementiert.
Verpflichtung zur Implementierung Es besteht keine Verpflichtung, eine bestimmte Menge an Methoden zu implementieren, außer denen, die an die Struktur angehängt sind. Jede Struktur, die die Golang-Schnittstelle "implementiert", muss alle ihre Methoden bereitstellen.
Zustandsspeicherung (Felder) Die Struktur kann Datenfelder enthalten. Die Schnittstelle enthält keine Datenfelder.

Beispiel für eine Nachahmung:

// Schnittstelle, die eine abstrakte Klasse imitiert
type Shape interface {
	Area() float64
	Perimeter() float64
}

// Struktur, die eine normale Klasse imitiert
type Circle struct {
	Radius float64
}

// Implementierung der Schnittstellenmethoden für Circle
func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius
}

func (c Circle) Perimeter() float64 {
	return 2 * 3.14 * c.Radius
}

// Eine weitere Struktur, die die Schnittstelle implementiert
type Rectangle struct {
	Width, Height float64
}

func (r Rectangle) Area() float64 {
	return r.Width * r.Height
}

func (r Rectangle) Perimeter() float64 {
	return 2 * (r.Width + r.Height)
}

In diesem Beispiel fungiert Shape als Vertrag (ähnlich einer abstrakten Klasse oder Schnittstelle in anderen Sprachen), und Circle sowie Rectangle sind konkrete Implementierungen (Analoga zu normalen Klassen). Wir können Instanzen von Circle und Rectangle erstellen, aber nicht direkt von Shape. Beide Strukturen müssen außerdem die Methoden Area() und Perimeter() implementieren, um die Schnittstelle Shape "zu erfüllen".