Tout a commencé lorsque j'ai essayé d'hériter des classes en Python. Du point de vue de moi-même, qui a eu affaire à Java jusqu'à présent J'ai pensé: "Qu'est-ce que c'est !!!!!!", donc dans certains langages de programmation J'ai comparé la méthode de description de l'héritage de classe avec la méthode de description et le comportement du constructeur.
Écrivez, comparez, visualisez et exprimez vos impressions sur Java.
J'ai utilisé paiza.IO pour vérifier le fonctionnement. Pratique. https://paiza.io/ja
--Classe parentale (Super classe) --Préparation d'un constructeur par défaut. Sortie de la chaîne de caractères "★ Parent constructeur" vers la console --Préparer une fonction / méthode --Sortir la chaîne de caractères passée en argument à la console --Child class (classe à hériter) --Hériter de la classe Parent --Préparation d'un constructeur par défaut. Sortie de la chaîne de caractères "☆ Constructeur enfant" vers la console --Préparer une fonction / méthode --Sortir la chaîne de caractères passée en argument à la console --Appelez la fonction / méthode Super classe avec la chaîne de caractères "★ La fonction / méthode du parent peut être appelée" comme argument.
Java Personnellement, c'est la langue que je connais le mieux. La version est Java 12.
Parent.java
public class Parent {
public Parent(){
System.out.println("★ Constructeur parent");
}
protected void parentMethod(String message){
System.out.println(message);
}
}
Child.java
public class Child extends Parent{
public Child(){
System.out.println("☆ Constructeur enfant");
}
public void childMethod(String message){
System.out.println(message);
parentMethod("★ Vous pouvez appeler la méthode Parent");
}
}
Main.java
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.childMethod("☆ Vous pouvez appeler la méthode Child");
}
}
★ Constructeur parent ☆ Constructeur enfant ☆ Vous pouvez appeler la méthode Child ★ Vous pouvez appeler la méthode Parent
――Comment écrire l'héritage de classe et le constructeur qui vous conviennent le mieux personnellement
Python Ensuite, l'opportunité d'écrire cet article. La version est Python 3.6.8.
** classe ** * Classe héritière * ** (** * Super classe * **): **
** def \ _ \ _ init \ _ \ _ (soi ** *, si un argument * **): ** ** Processus de définition de la valeur initiale par exemple self **
** def \ _ \ _ new \ _ \ _ (cls ** *, si un argument * **): ** ** renvoie super (). \ _ \ _ New \ _ \ _ (cls ** *, s'il y a un argument * **) **
** * Les exemples suivants, les résultats d'exécution (console) et les impressions concernent la fonction \ _ \ _ init \ _ \ _. ** **
parent.py
class Parent(object):
def __init__(self):
print('★ Constructeur parent')
def parent_function(self, message):
print(message)
child.py
from parent import Parent
class Child(Parent):
def __init__(self):
print('☆ Constructeur enfant')
def child_function(self, message):
print(message)
Parent.parent_function(self, '★ Vous pouvez appeler la fonction Parent')
main.py
from child import Child
def main():
ch = Child()
ch.child_function('☆ Vous pouvez appeler la fonction enfant')
if __name__ == '__main__':
main()
☆ Constructeur enfant ☆ Vous pouvez appeler la fonction enfant ★ Vous pouvez appeler la fonction Parent
Well "Eh bien, utilisez-vous des parenthèses dans l'héritage de classe? N'est-ce pas faux avec l'argument?"
child.py
from parent import Parent
class Child(Parent):
def __init__(self):
Parent.__init__(self) #Ajouté ici! !! !! !! !! !!
print('☆ Constructeur enfant')
def child_function(self, message):
print(message)
Parent.parent_function(self, '★ Vous pouvez appeler la fonction Parent')
-Une seule fonction \ _ \ _ init \ _ \ _ peut être préparée dans une classe
Au départ, seule la fonction \ _ \ _ init () \ _ \ _ était décrite, Depuis que j'ai reçu des commentaires, j'ai également étudié la fonction \ _ \ _ new \ _ \ _.
-La fonction ** \ _ \ _ new \ _ \ _ fonctionne ** lorsque l'instance est créée, elle fonctionne donc avant la fonction ** \ _ \ _ init \ _ \ _ **.
Vous trouverez ci-dessous la documentation de Python 3.7.4.
Lors de l'implémentation de la fonction \ _ \ _ new \ _ \ _, vous avez besoin de return super () .__ new __ (cls [, ...])
.
https://docs.python.org/ja/3/reference/datamodel.html#object.new
Dans une implémentation typique, lors de la création d'une nouvelle instance d'une classe, spécifiez les arguments appropriés pour super (). \ _ \ _ New \ _ \ _ (cls [, ...]) et \ _ pour la super classe. Appelez la méthode \ _new \ _ \ _ () pour apporter les modifications nécessaires à l'instance nouvellement créée avant de la renvoyer.
Il a été écrit correctement (´ ・ ω ・ `) https://docs.python.org/ja/3/reference/datamodel.html#object.init
Appelé après la création d'une instance (par \ _ \ _ new \ _ \ _ ()) et avant d'être renvoyée à l'appelant. L'argument est ce que vous passez à l'expression du constructeur de la classe. Si la classe de base et sa classe dérivée ont une méthode \ _ \ _ init \ _ \ _ (), la méthode \ _ \ _ init \ _ \ _ () de la classe dérivée est la méthode \ _ \ _ init \ _ \ _ de la classe de base ( ) Vous devez appeler explicitement la méthode pour vous assurer que la partie classe de base de l'instance est correctement initialisée. Par exemple, super (). \ _ \ _ Init \ _ \ _ ([args ...]).
Il semble que la fonction \ _ \ _ new \ _ \ _ était meilleure si elle était alignée avec le constructeur Java. ..
Lorsque j'ai remplacé l'exemple implémenté par la fonction \ _ \ _ init \ _ \ _ par la fonction \ _ \ _ new \ _ \ _ telle quelle, Le résultat de l'exécution (console) est le suivant. ☆ Constructeur enfant ★ Constructeur parent ☆ Vous pouvez appeler la fonction enfant ★ Vous pouvez appeler la fonction Parent
Ruby Par la logique mystérieuse que Python et Ruby. La version est Ruby 2.6.3.
** class ** * Classe héritière * ** <** * Super classe * end
** def initialize (** * si un argument * **) ** end
parent.rb
class Parent
def initialize()
puts "★ Constructeur parent"
end
def parent_function(message)
puts message
end
end
child.rb
require("./parent.rb")
class Child < Parent
def initialize()
puts "☆ Constructeur enfant"
end
def child_function(message)
puts message
parent_function("★ Vous pouvez appeler la fonction Parent")
end
end
main.rb
require("./child.rb")
child = Child.new
child.child_function("☆ Vous pouvez appeler la fonction enfant")
☆ Constructeur enfant ☆ Vous pouvez appeler la fonction enfant ★ Vous pouvez appeler la fonction Parent
«Cela ressemble à une description qui transmet le sentiment d'héritage de la classe. C'est comme Python que le constructeur est une fonction avec un nom fixe
--Semblable à Python, la fonction initialize de la classe Parent est écrasée par la fonction initialize de la classe Child.
--Lorsque la fonction d'initialisation de la classe Child est supprimée et exécutée, "★ Parent constructeur" est affiché.
--Avec super
, exécutez également la fonction d'initialisation de Parent
child.rb
require("./parent.rb")
class Child < Parent
def initialize()
super() #Ajouté ici! !! !! !! !! !!
puts "☆ Constructeur enfant"
end
def child_function(message)
puts message
parent_function("★ Vous pouvez appeler la fonction Parent")
end
end
--Une seule fonction d'initialisation peut être préparée par classe
PowerShell Dans la formation des nouveaux employés de l'entreprise, il y avait un thème pour créer un script PowerShell, donc je l'ai inclus. Il n'y avait pas d'héritage de classe dans PowerShell (Kiri), donc je pensais en faire une punch line ... **. ** ** Ce n'était pas sur paiza.IO, j'ai donc vérifié le fonctionnement sur mon PC.
** class ** * Classe héritière * : ** * Super classe * ** { }
parent.psm1
class Parent {
Parent() {
write-host("★ Constructeur parent")
}
parent_function([String] $message) {
write-host($message)
}
}
child.ps1
using module ".\parent.psm1"
class Child : Parent {
Child(){
write-host("☆ Constructeur enfant")
}
child_function([String] $message) {
write-host($message)
([Parent]$this).parent_function("★ Vous pouvez appeler la fonction Parent")
}
}
main.ps1
. .\child.ps1
$child = [Child]::new()
$child.child_function("☆ Vous pouvez appeler la fonction enfant")
★ Constructeur parent ☆ Constructeur enfant ☆ Vous pouvez appeler la fonction enfant ★ Vous pouvez appeler la fonction Parent
$ this
avec la super classe" **À part Java, Python, Ruby et PowerShell, il y avait des choix «J'ai écrit mais je n'ai jamais utilisé de classes». J'ai pensé essayer quelques autres langages de programmation que je n'avais pas touchés auparavant. Je suis désolé, je suis épuisé par PowerShell.
paiza.IO a de nombreux langages de programmation utilisables, donc Si je me sens mieux, j'aimerais l'ajouter si j'essaye d'autres choses. ** Quoi qu'il en soit, paiza.IO est vraiment pratique. ** **
Comparez comment écrire C'était amusant de comprendre les caractéristiques de chaque langage de programmation et le manque de compréhension de ma compréhension! Merci de rester avec nous jusqu'à la fin.
Recommended Posts