Java-Programmierer berührt Go-Sprache (Java-Vererbung in Go-Sprache implementieren)

image

Mein Name ist keita69sawada.

Der Java-Programmierer hat (vorerst) versucht, die Go-Sprache zu berühren, gefolgt vom Erlernen der Go-Sprache.

Als ich es mit UML auf die gleiche Weise wie das Design von Java-Klassen entwarf, konnte ich mir nicht vorstellen, wie eine gemeinsame Verarbeitung (abstrakte Methode) realisiert werden sollte, da ** Go-Sprache keine "Erweiterungen" hat **. .. ..

Dann: "Implementieren wir ein einfaches Java-Klassendesign in der Sprache Go!" Dieser Artikel war uni-uni.

Zielgruppe

Voraussetzungen

Einführung

Ersetzen wir ein einfaches Beispiel durch Java-Erweiterungen mit der Sprache Go. Implementieren wir die "Quietsch" -Methode in den Klassen "Hund" und "Katze", die "Tier" erben.

1. Klassendiagramm

Es ist keine strenge UML, aber ist es so?

image

3. Wenn Sie versuchen, dasselbe in der Go-Sprache zu erreichen ...

Unten war ich besorgt (; ´Д `)

  1. Wie soll ich die Go-Sprachquelldatei aufteilen? (Kein Konzept der Klasse ...)
  1. Wie sollte eine gemeinsame Verarbeitung (abstrakte Methode) realisiert werden, da es in der Go-Sprache kein Konzept der Vererbung gibt?

Ich habe auf meine eigene Weise über diese Sorgen nachgedacht.

4. [Problem Nr. 1] Wie soll ich die Quelldatei der Go-Sprache teilen? (Kein Konzept der Klasse ...)

Ich habe die Struktur der Java-Quelldatei mit der Struktur der Quelldatei der Go-Sprache verglichen.

4-1. Struktur der Java-Quelldatei

Wenn ein Java-Programmierer die Struktur der Quelldatei anhand des obigen Klassendiagramms festlegt, denke ich, dass es sich normalerweise um eine Klasse und eine Datei handelt.

Dateiorganisation


└─src
    ├─animal                         //Java Package Unit Ordner
    │      Animal.java               //Java-Klasseneinheit
    │      Cat.java
    │      Dog.java
    │
    └─main
            Main.java

4-2. Gehe zur Struktur der Sprachquelldatei

Es hat die gleiche Struktur wie die Java-Quelldateistruktur. Diesmal ** wage ** das gleiche.

Dateiorganisation


└─src
    ├─animal                         //Gehen Sie zum Paketeinheitenordner
    │      Animal.go                 //go hat kein Konzept von Klasse
    │      Cat.go
    │      Dog.go
    │
    └─main
            Main.go

Es gibt kein Konzept für Klassen in der Go-Sprache, daher müssen die drei Quelldateien (Animal.go, Cat.go, Dog.go) nicht aufgeteilt werden. ** (Die Pakete müssen jedoch identisch sein)

Zum Beispiel ist es grammatikalisch in Ordnung, sie wie folgt zu einer Datei zu kombinieren. (Es ist nur grammatikalisch ...)

Dateiorganisation


└─src
    ├─animal 
    │      Animal_Cat_Dog.go   //Es ist grammatikalisch in Ordnung, sie in einer Quelldatei zu kombinieren
    │
    └─main
            Main.go

4-3. Zusammenfassung von "Trouble 1"

Die ** meine eigene Antwort ** auf "Was soll ich mit der Quelldateidivision der Go-Sprache tun? (Klassenkonzept oder ...)" lautet wie folgt.

5. [Problem Nr. 2] Wie sollte eine gemeinsame Verarbeitung (abstrakte Methode) realisiert werden, da es in der Go-Sprache kein Konzept für die Vererbung gibt?

5-1. Gemeinsame Verarbeitung (abstrakte Methode)

Schauen wir uns zunächst die Java-Quelle an. Tiere implementieren das Verhalten von Rinde mit einer abstrakten Methode.

Animal.java


package animal;

public abstract class Animal {
    public abstract void bark();
}

Und die Quelle der Go-Sprache. Die Go-Sprache verfügt nicht über eine abstrakte Methode, sondern implementiert stattdessen das Verhalten von Rinde an der Schnittstelle.

** "Es gibt kein abstraktes Konzept eines Tieres (ein Ersatz für eine Klasse)" **. ..

Animal.go


package animal

type Barker interface {
	Bark(string)
}

Es scheint auch, dass wenn der Anfang groß geschrieben wird, er zu einem öffentlichen Bereich wird.

5-2. Betonobjekt (Katze)

Dies ist auch aus Java-Quelle. Katzenklasse hat eine Katzenstimme Es hat ein Rindenverhalten.

Cat.java


package animal;

public class Cat extends Animal {
    private String voice = "Nya Nya";

    public void bark() {
        System.out.println(this.voice);
    }
}

Als nächstes kommt die Sprache Go.

Da die Go-Sprache kein Klassenkonzept hat, ** definieren Sie eine Katze mit einer Struktur und deklarieren Sie sie als Datentyp vom Typ Katze. Der Datentyp kann jedoch keinen Wert ("voice = Nya Nya") wie die Java-Klasse haben.

Hier kommt die ** Java-Konstruktor-ähnliche Methode NewCat () **. Diese Methode gibt beim Erstellen einer Instanz des Datentyps (Cat) einen Wert ("Nya Nya") an.

Implementieren Sie dann Bark (), das in der in Animal.go definierten Schnittstelle deklariert ist. Der Punkt hier ist der Empfänger. ** Empfänger sind "methodendefiniert für Datentypen" **. Hier handelt es sich um eine Methode vom Datentyp (Typ Cat struct) (Bark ()).

Cat.go


package animal

import (
	"fmt"
)

type Cat struct {    //Strukturieren Sie die Katze(struct)Definiert in
	voice string
}

func NewCat() *Cat {  //Java-Konstruktor-ähnliche Methode
	return &Cat{"Nya Nya"} 
}

func (c Cat) Bark(){  //Empfänger
	fmt.Println(c.voice)
}

5-3. Konkretes Objekt (Hund)

Ausgelassen, weil es dasselbe ist wie Cat.

5-4. Hauptobjekt

Schließlich Main. Dies ist auch aus Java. Erstellen Sie eine Instanz des konkreten Objekts von Cat, Dog, Sie rufen die in der Schnittstelle (Animal) definierte Methode (bark) auf.

Main.java


package main;

import animal.Cat;
import animal.Dog;
import animal.Animal;

public class Main {
    public static void main(String[] args) {
       Animal c = new Cat();
       Animal d = new Dog();

       c.bark();
       d.bark();
    }
}

Als nächstes kommt die Sprache Go. Das Konvertieren eines konkreten Objekts (Katze oder Hund) in eine Schnittstelle (Baker) entspricht im Wesentlichen Java und ist daher leicht zu verstehen.

Main.go


package main

import (
	"animal"
)

func main(){
	var c animal.Barker = animal.NewCat()
	var d animal.Barker = animal.NewDog()

	c.Bark()
	d.Bark()
}

Zusammenfassung

Durch die Implementierung des gleichen Designs in Go-Sprache und Java-Sprache scheint es möglich zu sein, Java-Sprachdesign (Klassendesign) auf Go-Sprache anzuwenden. Da es jedoch Unterschiede bei den Sprachspezifikationen bei der Implementierung gibt, scheint es notwendig zu sein, das Implementierungsmuster wie dieses Mal zu lernen, um das Java-Sprachklassen-Design auf die Go-Sprache anzuwenden.

Die Java-Sprache eignet sich möglicherweise für große (große) Implementierungen, da Sie zwischen Klassen durch Erweiterungen und Implementierungen einschränken und deren Rollen klären können. .. Andererseits war ich der Meinung, dass die Go-Sprache für Anwendungen geeignet ist, die häufig geändert werden, da die Einschränkungen locker sind und die Abhängigkeit zwischen Objekten gering ist.

Referenz-URL

Recommended Posts

Java-Programmierer berührt Go-Sprache (Java-Vererbung in Go-Sprache implementieren)
Implementieren Sie den rekursiven Abschluss in Go
Hallo Welt in GO-Sprache
Implementieren Sie einen tabellengesteuerten Test in Java
Versuchen Sie, Yuma in der Sprache Go zu implementieren
Schreiben Sie einen Test in GO-Sprache + Gin
Machen Sie etwas objektorientiertes in der GO-Sprache
Der Java-Programmierer versuchte (vorerst), die Sprache Go zu berühren.
Implementieren und verstehen Sie den Union-Find-Baum in Go
Erstellen Sie einen Webserver in der Sprache Go (net / http) (1)
Gehen Sie in die Sprache, um Teil 7 C in der Sprache GO zu sehen und sich daran zu erinnern