#javascript #constructor #overriding #es6-class
#javascript #конструктор #переопределение #es6-класс
Вопрос:
В обучении Udacity ES6 возникает вопрос о переопределении конструктора базового класса. У меня есть решение, но Udacity не позволяет мне выйти сухим из воды.
Задание таково: создайте подкласс Bicycle, который расширяет класс Vehicle. Подкласс Bicycle должен переопределить функцию конструктора транспортного средства, изменив значения по умолчанию для колес с 4 на 2 и звукового сигнала с «beep beep» на «honk honk».
class Vehicle {
constructor(color = 'blue', wheels = 4, horn = 'beep beep') {
this.color = color;
this.wheels = wheels;
this.horn = horn;
}
honkHorn() {
console.log(this.horn);
}
}
// your code here
/* tests
const myVehicle = new Vehicle();
myVehicle.honkHorn(); // beep beep
const myBike = new Bicycle();
myBike.honkHorn(); // honk honk
*/
Решение, которое я придумал, это:
class Bicycle extends Vehicle {
constructor(wheels, horn){
super(wheels, horn)
this.wheels = 2
this.horn = "honk honk"
}
honkHorn(){
super.honkHorn()
}
}
Но этого недостаточно, и я не понимаю, почему это так. Обратная связь, которую я получил, такова:
Ваш конструктор велосипедов не устанавливает значения по умолчанию для цвета, колес и звукового сигнала
Комментарии:
1. Я думаю, что упражнение ожидает, что вы установите значения по умолчанию для всех аргументов конструктора даже в вашем классе Bicycle. Что-то вроде этого: jsfiddle.net/nf570m4k
2. расширяя приведенный выше ответ (на вашем велосипеде)
constructor(wheels = 2, horn = 'tring tring')
Ответ №1:
вы не должны использовать
this.wheels = 2
this.horn = "honk honk"
когда они уже переопределены в суперконструкторе.
class Vehicle {
constructor(color = 'blue', wheels = 4, horn = 'beep beep') {
this.color = color;
this.wheels = wheels;
this.horn = horn;
}
honkHorn() {
console.log(this.horn);
}
}
class Bicycle extends Vehicle {
constructor(wheels = 2, horn = 'honk honk') {
super(undefined, wheels, horn);
}
honkHorn() {
super.honkHorn()
}
}
let by = new Bicycle();
by.honkHorn();
Комментарии:
1. вы пробовали удалить «это»? колеса = 2 это. horn = «honk honk» ` из Bycible constructor . @Edwin
2. Вы также не должны устанавливать значение color как undefined. Это не позволит вам отправлять сообщения с цветом, установленным на неопределенный. Просто используйте:
class Bicycle extends Vehicle { constructor(color, wheels = 2, horn = "honk honk") { super(color, wheels, horn); }
Ответ №2:
class Bicycle extends Vehicle {
constructor(wheels =2, horn= "honk honk"){
super(undefined, wheels, horn)
}
honkHorn(){
super.honkHorn()
}
}
затем для теста я добавил:
const yourBike = new Bicycle(3, "tring tring")
Хотя другие варианты действительно давали правильные ответы для тестовых примеров, описанных в вопросе. Добавив этот дополнительный тест, я обнаружил, что переопределение конструктора базового класса невозможно ни из super, ни из this.колеса (как и моя первая попытка).
Однако Udacity не принимает его……