Variables de instancia y estáticas
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 9 de 65.
Un var normal en una clase es una variable de instancia: cada objeto tiene la suya. Un static var pertenece a la clase: hay un único valor compartido por todos los objetos.
# student.gd
class_name Student
extends RefCounted
static var school: String = "Godot High"
static var count: int = 0
var student_name: String
func _init(new_name: String) -> void:
student_name = new_name
count += 1var ada := Student.new("Ada")
var bo := Student.new("Bo")
print(Student.count) # 2
print(ada.student_name, " and ", bo.student_name) # Ada y Bo
Student.school = "Godot Academy"
print(ada.school) # Godot Academy
print(bo.school) # Godot AcademyLee una variable estática mediante el nombre de la clase, como Student.count, sin necesitar ningún objeto. Dentro de la clase, usa su nombre: count += 1 en _init() cuenta a todos los estudiantes creados hasta el momento.
Cambiar Student.school lo cambia para todos los estudiantes a la vez. ada.school = "Night School" haría lo mismo, porque solo hay un school; escribir el nombre de la clase lo deja claro.
Una const se comparte de la misma manera, pero nunca puede cambiar. Usa una static var para los datos compartidos que cambian mientras se ejecuta el programa, como un contador o una configuración que siguen todos los objetos.
Desafío
FácilCompleta la clase BankAccount en bank_account.gd:
- una variable
intestáticainterest_percentque empieza en2, compartida por todas las cuentas - una variable
intestáticaaccount_countque empieza en0; el constructor le suma1por cada cuenta nueva describe()devuelveHOLDER: $BALANCE at PERCENT%, usandoholderybalancede la cuenta, y elinterest_percentcompartido
El código proporcionado lee cuántas cuentas siguen y una línea holder balance para cada una, y después una nueva tasa de interés. Imprime BankAccount.account_count y cada cuenta, establece BankAccount.interest_percent en la nueva tasa e imprime cada cuenta otra vez. Para Alice 1000, Bob 2000 y la tasa 3, imprime:
Accounts opened: 2
Alice: $1000 at 2%
Bob: $2000 at 2%
After the rate change:
Alice: $1000 at 3%
Bob: $2000 at 3%Tu código va en bank_account.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: déjalo tal como está
var accounts: Array[BankAccount] = []
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
accounts.append(BankAccount.new(parts[0], int(parts[1])))
print("Accounts opened: %d" % BankAccount.account_count)
for account in accounts:
print(account.describe())
BankAccount.interest_percent = int(OS.read_string_from_stdin())
print("After the rate change:")
for account in accounts:
print(account.describe())
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