Menu
CoddyTech

Fonctions statiques

Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 10 sur 65.

Une static func appartient à la classe, comme une variable statique. Vous l’appelez via le nom de la classe, sans objet, comme dans la leçon sur les fichiers : Greeter.greet("Ada"). Une classe peut combiner des fonctions statiques et des méthodes ordinaires :

# student.gd
class_name Student
extends RefCounted

static var count: int = 0
var student_name: String
var score: int

func _init(new_name: String, new_score: int) -> void:
	student_name = new_name
	score = new_score
	count += 1

static func is_passing(points: int) -> bool:
	return points >= 60

static func from_line(line: String) -> Student:
	var parts := line.split(" ")
	return Student.new(parts[0], int(parts[1]))
print(Student.is_passing(72)) # true
var ada := Student.from_line("Ada 91")
print(ada.score) # 91
print(Student.count) # 1

Une fonction statique s’exécute sans objet ; elle ne peut donc pas utiliser de variables d’instance ni self : score dans is_passing() est une erreur signalée avant l’exécution du programme. Elle peut utiliser ses paramètres, des constantes, des variables statiques et d’autres fonctions statiques.

from_line() illustre un usage courant : une fonction statique qui construit et renvoie un objet, ici à partir d’une ligne de texte. C’est une deuxième façon de créer un Student, en plus de Student.new().

Tu peux aussi appeler une fonction statique sur un objet, comme dans ada.is_passing(50), mais le nom de la classe indique clairement qu’aucun objet n’est impliqué.

challenge icon

Défi

Facile

Écrivez le code de notation dans deux classes.

Grader dans grader.gd ne contient que des fonctions statiques :

  • letter(points) renvoie "A" pour 90 ou plus, "B" pour 80 ou plus, "C" pour 70 ou plus, "D" pour 60 ou plus et "F" en dessous
  • is_passing(points) renvoie true pour 60 ou plus

Student dans student.gd possède déjà ses propriétés et son constructeur. Complétez :

  • la fonction statique from_line(line), qui sépare une ligne comme Ada 91 à l’espace et renvoie un nouvel objet Student avec ce nom et ce score
  • la méthode report(), qui renvoie NAME: SCORE (LETTER), passed ou NAME: SCORE (LETTER), failed, en utilisant les deux fonctions de Grader

Le code fourni lit le nombre d’étudiants qui suivent, crée chacun d’eux avec Student.from_line(), affiche son rapport et compte enfin les étudiants ayant réussi. Pour Ada 91, Bo 42 et Cy 75, il affiche :

Ada: 91 (A), passed
Bo: 42 (F), failed
Cy: 75 (C), passed
Passed: 2 of 3

Votre code doit être placé dans grader.gd et student.gd. main.gd contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

extends Node

func _ready():
	# Code d’entrée/sortie fourni : conservez-le tel quel
	var count := int(OS.read_string_from_stdin())
	var passed := 0
	for i in count:
		var student := Student.from_line(OS.read_string_from_stdin())
		print(student.report())
		if Grader.is_passing(student.score):
			passed += 1
	print("Passed: %d of %d" % [passed, count])
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur GDScript en ligne