Funciones estáticas
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 10 de 65.
Una static func pertenece a la clase, como una variable estática. La llamas a través del nombre de la clase, sin un objeto, como hiciste en la lección sobre archivos: Greeter.greet("Ada"). Una clase puede combinar funciones estáticas con métodos ordinarios:
# 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 función estática se ejecuta sin un objeto, así que no puede usar variables de instancia ni self: score dentro de is_passing() es un error que se informa antes de que se ejecute el programa. Puede usar sus parámetros, constantes, variables estáticas y otras funciones estáticas.
from_line() muestra un uso común: una función estática que construye y devuelve un objeto, en este caso a partir de una línea de texto. Es una segunda forma de crear un Student, además de Student.new().
También puedes llamar a una función estática en un objeto, como en ada.is_passing(50), pero el nombre de la clase deja claro que no interviene ningún objeto.
Desafío
FácilEscribe el código de calificación en dos clases.
Grader en grader.gd tiene solo funciones estáticas:
letter(points)devuelve"A"para 90 o más,"B"para 80 o más,"C"para 70 o más,"D"para 60 o más y"F"por debajo de esois_passing(points)devuelvetruepara 60 o más
Student en student.gd ya tiene sus propiedades y su constructor. Completa:
- la función estática
from_line(line), que divide una línea comoAda 91por el espacio y devuelve un nuevoStudentcon ese nombre y esa puntuación - el método
report(), que devuelveNAME: SCORE (LETTER), passedoNAME: SCORE (LETTER), failed, usando las dos funciones deGrader
El código proporcionado lee cuántos estudiantes vienen a continuación, crea cada uno con Student.from_line(), imprime su informe y, por último, cuenta los estudiantes que aprobaron. Para Ada 91, Bo 42 y Cy 75, imprime:
Ada: 91 (A), passed
Bo: 42 (F), failed
Cy: 75 (C), passed
Passed: 2 of 3Tu código va en grader.gd y student.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
extends Node
func _ready():
# Código de entrada/salida proporcionado: mantenlo tal como está
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])
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de GDScript online