Проектная лаборатория
Собственный интерпретатор
Этап 81 · Наследование
Переопределение методов
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы добавите поддержку переопределения методов в свой интерпретатор Lox. Это позволит подклассам предоставлять собственную реализацию методов, определённых в суперклассе.
Ссылка на книгу
Код для этого этапа реализован в разделе 13.2: Наследование методов.
Проверки
Тестирующая система выполнит серию проверок с файлами test.lox, содержащими переопределение методов.
Например, если test.lox содержит следующее:
class A {
method() {
print "A method";
}
}
// B inherits method `method` from A
// and overrides it with a new implementation
class B < A {
method() {
print "B method";
}
}
var b = B();
b.method(); // expect: B methodТестирующая система запустит вашу программу следующим образом:
$ ./your_program.sh run test.lox
B methodТестирующая система выполнит несколько таких проверок с переопределением методов в разных контекстах, например:
Тестовый случай 1:
Входные данные:
class Base {
init(a) {
this.a = a;
}
}
// Constructors can also be overridden
class Derived < Base {
init(a, b) {
this.a = a;
this.b = b;
}
}
var derived = Derived(89, 32);
print derived.a;
print derived.b;Ожидаемый вывод:
89
32Тестовый случай 2:
Входные данные:
class Animal {
speak() {
return "Animal speaks";
}
makeSound() {
return "Generic sound";
}
communicate() {
return this.speak() + " : " + this.makeSound();
}
}
class Dog < Animal {
speak() {
return "Dog speaks";
}
makeSound() {
return "Woof";
}
}
class Puppy < Dog {
speak() {
return "Puppy speaks";
}
}
var animal = Animal();
var dog = Dog();
var puppy = Puppy();
print animal.communicate();
print dog.communicate();
print puppy.communicate();Ожидаемый вывод:
Animal speaks : Generic sound
Dog speaks : Woof
Puppy speaks : WoofТестирующая система проверит, что ваша программа корректно обрабатывает переопределение методов, включая:
- Корректное переопределение методов в подклассах.
- Переопределение конструкторов с новыми сигнатурами.
- Корректную работу нескольких уровней переопределения методов.
Примечания
- Этот формат вывода соответствует спецификации в репозитории книги
- Переопределённые методы должны полностью заменять реализацию суперкласса
- Переопределение методов должно работать через несколько уровней наследования
Проверка в вашей IDE
Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.
Настройка проекта и IDE
1. Создайте проект один раз
node '/opt/graphlms/tools/project-lab/cli.mjs' init interpreter ./my-interpreter --language go2. Откройте папку в IDE
cd ./my-interpreterРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage ka5Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.