Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Изменить метод наследника в родительском классе (https://javascript.ru/forum/misc/75006-izmenit-metod-naslednika-v-roditelskom-klasse.html)

Sigizmund2012 25.08.2018 13:25

Изменить метод наследника в родительском классе
 
Здравствуйте. Нужно переписать родительский базовый класс, чтобы выполнялись следующие условия:
class BaseClass {
    // ... ваш код
}
class MyClass extends BaseClass {
    result(a, b) {
        this.a = a;
        this.b = b;
        return 100 - this.a + this.b;
    }
}
let m = new MyClass();
m.result(10, 20) === 90;
m.result(20, 10) === 110;


В дочернем методе надо поменять местами a и b, но как это сделать из родителского класса непонятно.

Sigizmund2012 25.08.2018 16:32

В родительском конструкторе переопределить можно:
class BaseClass {

            constructor(a, b) {

                this.result = (a, b) => {
                    this.a = b;
                    this.b = a;
                    return 100 - this.a + this.b;
                }

            }

        }

        class MyClass extends BaseClass {
            result(a, b) {
                this.a = a;
                this.b = b;
                return 100 - this.a + this.b;
            }
        }

        let m = new MyClass();

        console.log(m.result(10, 20) === 90);
        console.log(m.result(20, 10) === 110);


Получается, что если имена методов совпадают, старый новым перезаписать нельзя.

Aetae 25.08.2018 22:31

Sigizmund2012, на самом деле можно, фишка в том что "методы класса" на самом деле методы лежащие в прототипе.
Задавая же "метод" в конструкторе вы на самом деле добавляете его самому получаемому объекту.
При вызове метода в первую очередь он ищется именно в объекте, а потом уже смотрит в цепочке прототипов.

Ну и смена из родительского класса методов ребёнка это полнейшая ересь. А так ещё вариант - прописать на a и b сеттеры и геттеры, чтоб выдавали значения друг друга.)


Часовой пояс GMT +3, время: 09:32.