splincodewd
@splincodewd
Developer

Как правильно переопределять метод в дочернем классе?

У меня получается глупая ситуация, но приведу пример-синоним моего кода

class Parent {

	constructor(){
	 
	}


	methodA(){
		// ..
		this.methodB();
		// ..
	}

	methodB(){
	 // empty because need override in child class 
	}


};


class Child1 extends Parent {

	constructor(){
		super();
	}

	methodB(){
	 // my actions
	}

}


Таких дочерних классов у меня полным полно, и они наследуются от родительского класса у которого есть метод A (прописывать его в каждом дочернем классе муторно, там много действий внутри происходит), но он вызывает метод B, внутрянка метода B для каждого дочернего класса своя (Child1, Child2, .., ChildN), но если я не пропишу его в родительском классе (тогда компилятор ругается и говорить, что не видит его), что делать? Как-то некрасиво смотрится, когда оставляю пустой метод в классе-родителе.
  • Вопрос задан
  • 720 просмотров
Решения вопроса 1
Apathetic
@Apathetic
Frontend
Первый вариант - сделать класс-родитель абстрактным и объявить в нем абстрактный метод methodB. Компилятор будет требовать, чтобы в классе-потомке в обязательном порядке был объявлен methodB
abstract class Parent {
  methodA(){
    this.methodB();
  }

  abstract methodB(): void
};

class Child1 extends Parent { // Ошибка: Non-abstract class 'Child1' does not implement inherited abstract member 'methodB' from class 'Parent'.
  constructor(){
    super();
  }
}


Если нет возможности объявить класс-родитель как абстрактный, можно объявить внутри него метод methodB и кидать в нем exception, мол, этот метод должен быть переобъявлен в потомке. Так ошибка будет ловиться только в рантайме, но это лучше, чем ничего.

P.S.: Но вообще полагаться в родителе на методы потомков - не очень хорошая практика =)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
26 апр. 2024, в 09:18
500 руб./в час
26 апр. 2024, в 06:46
1500 руб./в час
26 апр. 2024, в 05:31
1000 руб./за проект