Funzioni statiche
Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 10 di 65.
Una static func appartiene alla classe, come una variabile statica. La richiami tramite il nome della classe, senza un oggetto, come hai fatto nella lezione sui file: Greeter.greet("Ada"). Una classe può combinare funzioni statiche e metodi ordinari:
# 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) # 1Una funzione statica viene eseguita senza un oggetto, quindi non può usare variabili di istanza o self: score all’interno di is_passing() è un errore segnalato prima che il programma venga eseguito. Può usare i suoi parametri, le costanti, le variabili statiche e altre funzioni statiche.
from_line() mostra un uso comune: una funzione statica che crea e restituisce un oggetto, in questo caso a partire da una riga di testo. È un secondo modo per creare uno Student, oltre a Student.new().
Puoi anche chiamare una funzione statica su un oggetto, come in ada.is_passing(50), ma il nome della classe chiarisce che non è coinvolto alcun oggetto.
Sfida
FacileScrivi il codice di valutazione in due classi.
Grader in grader.gd ha solo funzioni statiche:
letter(points)restituisce"A"per 90 o più,"B"per 80 o più,"C"per 70 o più,"D"per 60 o più e"F"al di sottois_passing(points)restituiscetrueper 60 o più
Student in student.gd ha già le sue proprietà e il costruttore. Completa:
- la funzione statica
from_line(line), che divide una riga comeAda 91in corrispondenza dello spazio e restituisce un nuovoStudentcon quel nome e quel punteggio - il metodo
report(), che restituisceNAME: SCORE (LETTER), passedoppureNAME: SCORE (LETTER), failed, usando le due funzioni diGrader
Il codice fornito legge quanti studenti seguono, crea ciascuno con Student.from_line(), stampa il relativo resoconto e infine conta gli studenti promossi. Per Ada 91, Bo 42 e Cy 75 stampa:
Ada: 91 (A), passed
Bo: 42 (F), failed
Cy: 75 (C), passed
Passed: 2 of 3Il tuo codice va in grader.gd e student.gd. main.gd contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
extends Node
func _ready():
# Codice di input/output fornito: lascialo così com'è
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])
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore GDScript online