Menu
CoddyTech

Statische Funktionen

Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 10 von 65.

Eine static func gehört zur Klasse, wie eine statische Variable. Du rufst sie über den Klassennamen auf, ohne Objekt, wie in der Lektion über Dateien: Greeter.greet("Ada"). Eine Klasse kann statische Funktionen mit gewöhnlichen Methoden kombinieren:

# 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

Eine statische Funktion wird ohne ein Objekt ausgeführt und kann daher keine Instanzvariablen oder self verwenden: score innerhalb von is_passing() ist ein Fehler, der gemeldet wird, bevor das Programm ausgeführt wird. Sie kann ihre Parameter, Konstanten, statischen Variablen und andere statische Funktionen verwenden.

from_line() zeigt eine häufige Verwendung: eine statische Funktion, die ein Objekt erstellt und zurückgibt, hier aus einer Textzeile. Dies ist eine zweite Möglichkeit, einen Student zu erstellen, neben Student.new().

Du kannst eine statische Funktion auch auf einem Objekt aufrufen, wie in ada.is_passing(50), aber der Klassenname macht deutlich, dass kein Objekt beteiligt ist.

challenge icon

Aufgabe

Einfach

Schreibe den Bewertungscode in zwei Klassen.

Grader in grader.gd hat nur statische Funktionen:

  • letter(points) gibt bei 90 oder mehr "A", bei 80 oder mehr "B", bei 70 oder mehr "C", bei 60 oder mehr "D" und darunter "F" zurück
  • is_passing(points) gibt bei 60 oder mehr true zurück

Student in student.gd hat seine Eigenschaften und seinen Konstruktor bereits. Vervollständige:

  • die statische Funktion from_line(line), die eine Zeile wie Ada 91 am Leerzeichen aufteilt und eine neue Student-Instanz mit diesem Namen und dieser Punktzahl zurückgibt
  • die Methode report(), die NAME: SCORE (LETTER), passed oder NAME: SCORE (LETTER), failed zurückgibt und dabei die beiden Grader-Funktionen verwendet

Der bereitgestellte Code liest ein, wie viele Studierende folgen, erstellt jede Person mit Student.from_line(), gibt ihren Bericht aus und zählt schließlich die Studierenden, die bestanden haben. Für Ada 91, Bo 42 und Cy 75 gibt er Folgendes aus:

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

Dein Code gehört in grader.gd und student.gd. main.gd enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

extends Node

func _ready():
	# Vorgegebener Ein-/Ausgabecode: unverändert lassen
	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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-GDScript-Compiler