Le programmeur Java a touché le langage Go (implémenter l'héritage Java en langage Go)

image

Mon nom est keita69sawada.

Le programmeur Java a essayé de toucher le langage Go (pour le moment), suivi par l'étude du langage Go.

Quand je l'ai conçu avec UML de la même manière que la conception de classe Java, je ne pouvais pas imaginer comment réaliser un traitement commun (méthode abstraite) car il n'y a pas d '"étend" en ** Go language **. .. ..

Ensuite, "Implémentons une conception de classe Java simple en langage Go!" Cet article était uni-uni.

Public cible

Conditions préalables

introduction

Remplaçons un simple exemple par des extensions Java par le langage Go. Implémentons la méthode "squeal" dans les classes "dog" et "cat" qui héritent de "animal".

1. Diagramme de classe

Ce n'est pas un UML strict, mais est-ce que c'est comme ça?

image

3. Lorsque vous essayez d'atteindre la même chose en langage Go ...

Ci-dessous, j'étais inquiet (; ´Д `)

  1. Comment dois-je diviser le fichier source de la langue Go? (Pas de notion de classe ...)
  1. Puisqu'il n'y a pas de concept d'héritage en langage Go, comment réaliser un traitement commun (méthode abstraite)?

J'ai pensé à ces inquiétudes à ma manière.

4. [Problème n ° 1] Comment dois-je diviser le fichier source de la langue Go? (Pas de notion de classe ...)

J'ai comparé la structure du fichier source Java avec la structure du fichier source du langage Go.

4-1. Structure du fichier source Java

Lorsqu'un programmeur Java décide de la structure du fichier source en regardant le diagramme de classes ci-dessus, je pense qu'il s'agit généralement d'une classe et d'un fichier.

organisation des fichiers


└─src
    ├─animal                         //dossier d'unité de package java
    │      Animal.java               //unité de classe Java
    │      Cat.java
    │      Dog.java
    │
    └─main
            Main.java

4-2. Structure du fichier source de la langue Go

Il a la même structure que la structure du fichier source Java. Cette fois ** osez ** la même chose.

organisation des fichiers


└─src
    ├─animal                         //aller dans le dossier d'unité de package
    │      Animal.go                 //go n'a pas de concept de classe
    │      Cat.go
    │      Dog.go
    │
    └─main
            Main.go

Il n'y a pas de concept de classes dans le langage Go, il n'est donc pas nécessaire de ** diviser les trois fichiers sources (Animal.go, Cat.go, Dog.go). ** (Cependant, les packages doivent être les mêmes)

Par exemple, il est grammaticalement correct de les combiner en un seul fichier comme suit. (C'est juste grammaticalement ...)

organisation des fichiers


└─src
    ├─animal 
    │      Animal_Cat_Dog.go   //Il est grammaticalement acceptable de les combiner en un seul fichier source
    │
    └─main
            Main.go

4-3. Résumé du "Problème 1"

La ** ma propre réponse ** à "Que dois-je faire avec la division du fichier source du langage Go? (Concept de classe ou ...)" est la suivante.

5. [Problème # 2] Puisqu'il n'y a pas de concept d'héritage en langage Go, comment réaliser un traitement commun (méthode abstraite)?

5-1. Traitement commun (méthode abstraite)

Jetons d'abord un coup d'œil à la source Java. Les animaux mettent en œuvre le comportement de l'écorce avec des méthodes abstraites.

Animal.java


package animal;

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

Et la source du langage Go. Le langage Go n'a pas de méthode abstraite, donc implémente à la place le comportement de bark à l'interface.

** "Il n'y a pas de concept abstrait d'animal (un substitut à une classe)" **. ..

Animal.go


package animal

type Barker interface {
	Bark(string)
}

Aussi, il semble que lorsque le début est capitalisé, il devient une portée publique.

5-2. Objet en béton (Cat)

Cela provient également de la source Java. La classe de chat a une voix de chat Il a un comportement d'aboiement.

Cat.java


package animal;

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

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

Vient ensuite le langage Go.

Puisque le langage Go n'a pas le concept de classes, ** définissez un chat avec une structure et déclarez-le comme type de données de type cat. Cependant, le type de données ne peut pas avoir de valeur ("voice = Nya Nya") comme la classe Java.

Voici la ** méthode de type constructeur Java NewCat () **. Cette méthode donne une valeur ("Nya Nya") lors de la création d'une instance du type de données (Cat).

Ensuite, implémentez Bark () déclaré dans l'interface définie dans Animal.go. Le point ici est le récepteur. ** Les récepteurs sont «définis par la méthode pour les types de données» **. Ici, c'est une méthode de type de données (type Cat struct) (Bark ()).

Cat.go


package animal

import (
	"fmt"
)

type Cat struct {    //Structurer le chat(struct)Défini dans
	voice string
}

func NewCat() *Cat {  //Méthode de type constructeur Java
	return &Cat{"Nya Nya"} 
}

func (c Cat) Bark(){  //receveur
	fmt.Println(c.voice)
}

5-3. Objet concret (Chien)

Omis car il est identique à Cat.

5-4. Objet principal

Enfin, Main. Cela vient également de Java. Créer une instance de l'objet concret de Cat, Dog, Vous appelez la méthode (bark) définie dans l'interface (Animal).

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();
    }
}

Vient ensuite le langage Go. La conversion d'un objet concret (Cat ou Dog) à une interface (Baker) est fondamentalement la même que Java, donc c'est facile à comprendre.

Main.go


package main

import (
	"animal"
)

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

	c.Bark()
	d.Bark()
}

Résumé

En implémentant la même conception en langage Go et en langage Java, il semble possible d'appliquer la conception du langage Java (conception de classe) au langage Go. Cependant, comme il existe des différences dans les spécifications du langage lors de l'implémentation, il semble qu'il soit nécessaire d'apprendre le modèle d'implémentation comme cette fois afin d'appliquer la conception de la classe de langage Java au langage Go.

Le langage Java peut convenir aux grandes (grandes) implémentations car il vous permet de contraindre entre les classes via des extensions et implémentations et de clarifier leurs rôles. .. D'un autre côté, j'ai senti que le langage Go convient aux applications fréquemment modifiées car les restrictions sont lâches et la dépendance entre les objets est faible.

URL de référence

Recommended Posts

Le programmeur Java a touché le langage Go (implémenter l'héritage Java en langage Go)
Mettre en œuvre une fermeture récursive dans Go
Hello World en langue GO
Mettre en œuvre un test piloté par table en Java
Essayez d'implémenter Yuma en langage Go
Ecrire un test en langue GO + gin
Faites quelque chose orienté objet dans le langage GO
Le programmeur Java a essayé de toucher le langage Go (pour le moment)
Implémenter et comprendre l'arborescence de recherche d'union dans Go
Créer un serveur Web en langage Go (net / http) (1)
Aller à la langue pour voir et se souvenir du langage Partie 7 C en langage GO