Статические функции
Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 10 из 65.
static func принадлежит классу, как и статическая переменная. Вызывай её через имя класса, без объекта, как ты делал в уроке о файлах: Greeter.greet("Ada"). В классе можно сочетать статические функции с обычными методами:
# 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Статическая функция выполняется без объекта, поэтому она не может использовать переменные экземпляра или self: обращение к score внутри is_passing() — это ошибка, о которой сообщается до запуска программы. Она может использовать свои параметры, константы, статические переменные и другие статические функции.
from_line() показывает распространённый способ использования: статическую функцию, которая создаёт и возвращает объект, в данном случае — из текстовой строки. Это второй способ создать Student, наряду с Student.new().
Вы также можете вызвать статическую функцию у объекта, как в ada.is_passing(50), но имя класса ясно показывает, что объект не задействован.
Задание
ЛегкоНапиши код для выставления оценок в двух классах.
В grader.gd класс Grader содержит только статические функции:
letter(points)возвращает"A"при 90 или больше,"B"при 80 или больше,"C"при 70 или больше,"D"при 60 или больше и"F"при значении нижеis_passing(points)возвращаетtrueпри 60 или больше
Класс Student в student.gd уже содержит свои свойства и конструктор. Реализуй:
- статическую функцию
from_line(line), которая разделяет строку, напримерAda 91, по пробелу и возвращает новый объектStudentс этим именем и оценкой - метод
report(), который возвращаетNAME: SCORE (LETTER), passedилиNAME: SCORE (LETTER), failed, используя обе функцииGrader
Предоставленный код считывает количество следующих за ним студентов, создает объект для каждого с помощью Student.from_line(), выводит его отчет и в конце подсчитывает количество студентов, сдавших экзамен. Для Ada 91, Bo 42 и Cy 75 он выводит:
Ada: 91 (A), passed
Bo: 42 (F), failed
Cy: 75 (C), passed
Passed: 2 of 3Твой код нужно разместить в grader.gd и student.gd. В main.gd находится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
extends Node
func _ready():
# Предоставленный код ввода-вывода: оставьте его без изменений
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])
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript