Machen Sie etwas objektorientiertes in der GO-Sprache

** Nachtrag ** Nicht objektorientiert in der Go-Sprache, sondern Go-like objektorientiert! Es scheint ein schlechtes Wort zu geben Ich habe im Kommentarbereich verschiedene Vorschläge erhalten, daher würde ich mich freuen, wenn Sie sie überprüfen könnten.


Ich bin auf halbem Weg zu Dip Co., Ltd. gekommen und habe API in Go-Sprache erstellt. Bis jetzt habe ich jeden Tag über lose objektorientierte Sprachen wie PHP und Ruby gesprochen.

Trotzdem hatte ich die Möglichkeit, meine bisherigen Arbeitserfahrungen zu nutzen. Dieses Mal möchte ich über "Ich habe dafür gesorgt, dass sich die Quelle der Go-Sprache gut anfühlt, indem ich meine früheren Arbeitserfahrungen genutzt habe."

Go-Sprache ist nicht objektorientiert

Wie jeder weiß, der mit der Go-Sprache arbeitet, gibt es in der Go-Sprache keine Objektorientierung. Es gibt keine Klassen, keine Vererbung, keine Konstruktoren. Das Objektdenken (keine Tippfehler), das ich bisher kultiviert habe, ist wie Müll.

Wenn Sie es in Go implementieren möchten, sollten Sie es gehorsam wie Go implementieren, aber dennoch ist die Idee, dass "wenn dies objektorientiert ist, sollte es so implementiert werden", überwältigend. Als ich lange im Internet gesucht habe, habe ich einige "Möglichkeiten gefunden, objektorientierte Dinge in der Go-Sprache zu tun". Ich habe eine schöne Implementierung in Bezug auf sie gemacht, daher werde ich sie mit einem Beispiel zusammenfassen.

Was du machen willst

Es gibt verschiedene Dinge, die objektorientiert sind, aber dieses Mal werden wir diesen Bereich anstreben.

Implementierungsbeispiel

package main

import (
	"fmt"
)

const line = "--------------------"

func main() {
	wiz := newWizard("Magisches Mädchen", 10, 10, 5)
	war := newWarrior("+‡†Berserker†‡+", 10, 15, 30)

	fmt.Println(wiz.hello())
	fmt.Println(war.hello())

	fmt.Println(line)
	fmt.Println(wiz.attack())
	fmt.Println(war.attack())

	fmt.Println(line)
	fmt.Println(wiz.magic())
	fmt.Println(war.attack())
}

type human struct {
	name string
	hp int
	ap int
}

func (h *human) init(name string, hp, ap int) {
	h.name = name
	h.hp = hp
	h.ap = ap
}

func (h *human) hello() string {
	return fmt.Sprintf("Hallo ich%s.", h.name)
}

func (h *human) attack() string {
	return fmt.Sprintf("%s Angriff!%d Schaden!", h.name, h.ap)
}

type wizard struct {
	human
	mp int
}

func newWizard(name string, hp, ap, mp int) *wizard {
	w := new(wizard)
	w.init(name, hp, ap)
	w.mp = mp
	return w
}

func (w *wizard) magic() string {
	if w.mp <= 0 {
		return fmt.Sprintf("%s hat keine Macht", w.name)
	}
	w.mp -= 1
	return fmt.Sprintf("%s benutzte Magie! 30 Schaden!", w.name)
}

type warrior struct {
	human
}

func newWarrior(name string, hp, ap, mp int) *warrior {
	w := new(warrior)
	w.init(name, hp, ap)
	return w
}

func (w *warrior) attack() string {
	return fmt.Sprintf("%s Angriff!%d Schaden!", w.name, w.ap*2)
}

Ausführungsergebnis

Hallo, ich bin ein magisches Mädchen.
Hallo ich+‡†Berserker†‡+ist.
--------------------
Magischer Mädchenangriff! 10 Schaden!
+‡†Berserker†‡+Attacke! 30 Schaden!
--------------------
Das magische Mädchen benutzte Magie! 30 Schaden!
+‡†Berserker†‡+Attacke! 30 Schaden!

Gewöhnlicher RPG-Profi

Beschreibung der Implementierung

Übergeordnete Klasse (Struktur)

type human struct {
	name string
	hp int
	ap int
}

Definieren Sie gemeinsame Eigenschaften

Konstruktor der übergeordneten Klasse (Struktur)

func (h *human) init(name string, hp, ap int) {
	h.name = name
	h.hp = hp
	h.ap = ap
}

In Go gibt es keine Struktur, sodass Sie jede Methode definieren können, die die Arbeit des Konstruktors erledigt. Ich nenne es hier "init", aber alles ist in Ordnung

Methode hängt von der übergeordneten Klasse (Struktur)

func (h *human) hello() string {
	return fmt.Sprintf("Hallo ich%s.", h.name)
}

func (h *human) attack() string {
	return fmt.Sprintf("%s Angriff!%d Schaden!", h.name, h.ap)
}

Untergeordnete Klasse (Struktur)

type wizard struct {
	human
	mp int
}

type warrior struct {
	human
}

Durch Angabe der übergeordneten Klasse (Struktur) können die in der übergeordneten Klasse (Struktur) definierten Eigenschaften und Methoden einbezogen (nicht vererbt) werden. Kleine Klasse (Struktur) Wenn Sie die Eigenschaften selbst erhöhen möchten, können Sie weiter beschreiben (vorher oder nachher)

Kleine Klasse (Struktur) Fabrik

func newWizard(name string, hp, ap, mp int) *wizard {
	w := new(wizard)
	w.init(name, hp, ap)
	w.mp = mp
	return w
}

func newWarrior(name string, hp, ap, mp int) *warrior {
	w := new(warrior)
	w.init(name, hp, ap)
	return w
}

Erstellen Sie eine Instanz der übergeordneten Klasse (Struktur) und rufen Sie den Konstruktor auf. Wenn Sie die Anfangseinstellungen für die untergeordnete Klasse (Struktur) eindeutig festlegen möchten, beschreiben Sie sie nacheinander.

Methode der kleinen Klasse (Struktur) (neu)

func (w *wizard) magic() string {
	if w.mp <= 0 {
		return fmt.Sprintf("%s hat keine Macht", w.name)
	}
	w.mp -= 1
	return fmt.Sprintf("%s benutzte Magie! 30 Schaden!", w.name)
}

Es ist auch möglich, eine Methode zu generieren, die einer kleinen Klasse (Struktur) gewidmet ist.

Methode der kleinen Klasse (Struktur) (überschreiben)

func (w *warrior) smash() string {
	return fmt.Sprintf("%Starker Angriff von s!%d Schaden!", w.name, w.ap*2)
}

Sie können Ihr eigenes Verhalten festlegen, indem Sie eine Methode mit demselben Namen definieren.

Anwendungsbeispiel

func main() {
	wiz := newWizard("Magisches Mädchen", 10, 10, 5)
	war := newWarrior("+‡†Berserker†‡+", 10, 15, 30)

	fmt.Println(wiz.hello())
	fmt.Println(war.hello())

	fmt.Println(line)
	fmt.Println(wiz.attack())
	fmt.Println(war.attack())

	fmt.Println(line)
	fmt.Println(wiz.magic())
	fmt.Println(war.smash())
}

Erstellen Sie eine Instanz, indem Sie die Factory der untergeordneten Klasse (Struktur) aufrufen, ohne sich um die übergeordnete Klasse (Struktur) kümmern zu müssen. Genießen Sie es, indem Sie gängige Methoden oder einzigartige Methoden aufrufen.

Versuchen Sie eine objektorientierte Implementierung

Sie können sogar mit Go-Sprache gehen! Und ein gutes Gefühl. Die Implementierung ist einfach geworden. Ich denke, es ist eine Ameise, es in dem Maße zu verwenden, in dem die Verarbeitung nicht kompliziert ist.

Referenzierte Seite

Ich bin sicher, ich habe Informationen aus vielen Artikeln und Websites aufgenommen und implementiert, aber als ich meinen PC initialisierte, habe ich die URL vergessen. Wir entschuldigen uns und danken Ihnen und stellen fest, dass dies kein vollständig origineller Artikel ist. Jeder sichert häufig.

Recommended Posts

Machen Sie etwas objektorientiertes in der GO-Sprache
Versuchen Sie, Yuma in der Sprache Go zu implementieren
Führen Sie so etwas wie Redis-Transaktionen in Python aus
Java-Programmierer berührt Go-Sprache (Java-Vererbung in Go-Sprache implementieren)
Was beim Nachahmen zu tun ist, wird in Python eingebettet
Erstellen Sie einen Webserver in der Sprache Go (net / http) (1)
Ich möchte am Ende etwas mit Python machen
Gehen Sie in die Sprache, um Teil 7 C in der Sprache GO zu sehen und sich daran zu erinnern
[Python-Version] Warum können Sie mit Java keine objektorientierte Entwicklung durchführen?
[Go language] So erhalten Sie Terminaleingaben in Echtzeit
Ich möchte so etwas wie Uniq in Python sortieren
Machen Sie so etwas wie einen Python-Interpreter mit Visual Studio Code
Einbettung der Maschinensprache in die Sprache C.
Implementieren Sie den rekursiven Abschluss in Go
go Sprachen lernen verschiedene Notizen 1
[Golang] Über den Sprachkanal Go
Machen Sie so etwas wie Fuzzing mit acceptRegex.py
Made gomi, ein Papierkorb-Tool für rm in Go-Sprache
PySide - Machen Sie etwas im Hintergrund, während Sie den modelllosen Dialog anzeigen
Ich wollte so etwas wie Elixirs Pipe in Python machen