LINUX.ORG.RU

как работает наследование в angular?

 , ,


0

1

объясните пожалуйста один момент по наследованию классов в angular2+

Есть два класса, один наследует другой. В обоих есть переменная listType. но инициализируется она только в наследнике

Помогите пожалуйста понять почему она доступна и в родителе тоже(это выражается в выводе console.log)

Живой пример тут: https://stackblitz.com/edit/angular-zdsscb

Получается, что производный класс наследуется от базового, но и базовый наследуется от дочернего? это прикол angular или нормальная ситуация для ООП вообще?

Несильно разбираюсь в синтаксисе angular, но видимо это работает так:

1) Срабатывает конструктор производного класса, там эта переменная инициализируется.
2) После чего срабатывает ngInit базового класса, там она выводится в консоль.

Ничего удивительного в таком поведении не вижу.

neversleep ★★ ()

В обоих есть переменная listType. но инициализируется она только в наследнике

Вообще не инициализируемые переменные это плохо.

У меня этот пример вообще не собрался:

ERROR in solution.ts
(8,5): Member 'listType' implicitly has an 'any' type.
Если в HelloComponent изменить тип listType на string, то такая ошибка:
ERROR in solution.ts
(8,5): Property 'listType' has no initializer and is not definitely assigned in the constructor.

fsb4000 ★★★★★ ()

this указывает на instance класса, а не на класс, поэтому всё работает как ожидалось. Это нормально для ООП.

x3al ★★★★★ ()
Ответ на: комментарий от x3al

Это нормально для ООП.

а не могли бы вы помочь с примером? я попытался воспроизвести ту же ситуацию на нативном JS, но не смог добиться того же поведения. вот моя попытка: https://jsfiddle.net/ytn3o5kd/8/

prozaik ()
Последнее исправление: prozaik (всего исправлений: 1)
Ответ на: комментарий от prozaik

Это ни разу не та же ситуация. Во-первых, ты обращаешься к переменной chel_ до определения. Во-вторых, не передаёшь аргументы в super(), отсюда и undefined в свойстве (но оно присутствует! можешь в Object.keys проверить)

x3al ★★★★★ ()
30 августа 2018 г.
Ответ на: комментарий от prozaik

Если упростить, TypeScript-код из вашего примера выглядит так:

class Parent {
  x: any  // *

  constructor() {
    console.log('parent constructor')
  }

  method() {
    console.log(`this.x is ${this.x}`)
  }
}


class Child extends Parent {
  x: string  // *

  constructor() {
    super()
    console.log('child constructor')
    this.x = 'X'
  }
}


const c = new Child()
c.method()

Видим предсказуемый результат:

parent constructor
child constructor
this.x is X

На нативном JS всё то же самое, за исключением объявления типов. Можете удалить строки, отмеченные *, и сами убедиться.

evbogdanov ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.