@typescript_ru

Страница 655 из 669
Алексей
15.06.2018
10:31:30
пошел проверять
ну просто объект потомка может иметь тип родителя (который декларируется, а не фактический тип), это как бы и есть суть наследования

точнее даже не только наследования, но и имплементации интерфейса (тогда тип родителя всегда будет интерфейсом)

kana
15.06.2018
10:32:52
да нет, я серьезно пишу

Google
kana
15.06.2018
10:33:12
ну типа я кресты не осилил в свое время

Сергей
15.06.2018
10:33:15
я когда на плюсах писал в существующем проекте, очень охуевал с этого

Алексей
15.06.2018
10:33:19
это же большая нагрузка, знать, виртуальный ли метод, какой когда вызовется
В Java к примеру метод всегда виртуальный (за исключением в некоторых случаях final, но их и переопределять нельзя)

kana
15.06.2018
10:33:19
слишком много тонкостей

Сергей
15.06.2018
10:33:29
бля

открыл c++ repl понял сколько нужно заморочек написать, чтобы это запустилось и закрыл

Алексей
15.06.2018
10:34:03
Сергей
15.06.2018
10:34:39
боюсь в крестах ООП - не самая сложная фича
ну мне лично с динамикой было сложновато

Alexander
15.06.2018
10:34:55
Child foo = new Parent() foo->doSmth() будет вызван у чайлда
Не, так не работает, причём нигде. Ребёнок может мимикрировать под родителя, не наоборот.

Alexander
15.06.2018
10:36:07
это же большая нагрузка, знать, виртуальный ли метод, какой когда вызовется
В компилируемых языках -- никакой. Там для каждого класса создаётся "динамическая таблица типов", и роутится всё за константное время. А вот что касается нагрузки на *разработчика* -- то да, собственно в этом и вся суть претензий к "сложному" ООП: хрен разберёшься как это работает без поллитры водки и шкурки автора

Google
Алексей
15.06.2018
10:36:16
открыл c++ repl понял сколько нужно заморочек написать, чтобы это запустилось и закрыл
struct Parent { virtual void doSmth() { cout << "Parent"; } }; sturct Child: Parent { virtual void doSmth() { cout << "Child"; } }; int main() { Parent *obj = new Child(); obj->doSmth(); //"Child" }

Алексей
15.06.2018
10:36:47
Не хочу тебя расстраивать

Alexander
15.06.2018
10:36:50
родитель не может под ребенка?
Нет. У него же ФИЗИЧЕСКИ может не хватать какой-то фичи у класса.

Алексей
15.06.2018
10:37:00
но в C++ структура и класс - это почти одно и тоже

kana
15.06.2018
10:37:09
это шарп

Алексей
15.06.2018
10:37:11
там отличия косметические

kana
15.06.2018
10:37:13
угадайте вывод



Сергей
15.06.2018
10:37:23
давненько я на плюсах не писал

)

Алексей
15.06.2018
10:37:43
вплоть до наследования структур от классов, и классов от структур

kana
15.06.2018
10:37:55
там даже ошибка есть, которая внезапно меняет вывод

госпади как это же это сложно

Alexander
15.06.2018
10:38:21
давненько я на плюсах не писал
так и в том же TS то же будет. Тебе компилятор вежливо скажет, что "так как у родителя в прототипе не хватает вот этого и этого, то ребёнком ему не быть". Это вполне себе универсальное правило

Дмитрий
15.06.2018
10:38:24
родитель не может под ребенка?
Может при контравариантном сабтайпинге

Сергей
15.06.2018
10:38:29
Нет. У него же ФИЗИЧЕСКИ может не хватать какой-то фичи у класса.
в движке сорс там такие жесткие касты… прост пздц

Алексей
15.06.2018
10:38:32
local variables referenced from lambda expression must be final
Не надо путать финальные переменные и финальные методы.

Grigorii
15.06.2018
10:38:38
1 2 2

Google
kana
15.06.2018
10:38:55
Дмитрий
15.06.2018
10:39:00
Не надо путать финальные переменные и финальные методы.
Поговорил с копипастой — день прошёл не зря

Alexander
15.06.2018
10:39:05
kana
15.06.2018
10:39:05
а если сделать public f, то 1 1 2

Алексей
15.06.2018
10:39:06
родитель не может под ребенка?
родитель сможет стать ребёнком если его скастовать

явно скастовать конечно же

Grigorii
15.06.2018
10:39:14
111
а не overide забыли?

kana
15.06.2018
10:39:35
а с override уже ну будет virtual

разные virtual в крестах и не в крестах

Алексей
15.06.2018
10:40:02
а с override уже ну будет virtual
не, вроде в шарпе без override нельзя

kana
15.06.2018
10:40:44
просто варнинг, ошибки нет

Алексей
15.06.2018
10:40:52
ааа

но override - это просто указание больше для программиста, что идёт переопределение виртуального метода

Alexander
15.06.2018
10:41:40
так. Горшочек, не вари! Я не думал, что мой вопрос про разницу типов и значений в TS вызовет обсуждение особенностей полиморфизма разных языков =)

Алексей
15.06.2018
10:41:49
И да, возвращаясь к наследованию.

в языках типа Java и C# вообще без наследования нельзя никак

Дмитрий
15.06.2018
10:42:38
Алексей
15.06.2018
10:42:41
(я имею ввиду конечно же наследование классов, а не имплементацию интерфейсов, что немножко другое)

Дмитрий
15.06.2018
10:43:11
Алексей
15.06.2018
10:43:48
Ну так и в каком-нибудь реакте не получится без наследования фактически

Google
Алексей
15.06.2018
10:44:05
правда его спрятать в HOC можно

но всё таки

Дмитрий
15.06.2018
10:44:17
явно скастовать конечно же
Опять магия вне Хогвартса

Сергей
15.06.2018
10:44:57


Алексей
15.06.2018
10:45:04
ну это не магия, хотя на самом деле такое поведение не рекомендуется, и его следует заменить как раз виртуальными методами

Сергей
15.06.2018
10:45:56
когда наследование вырастает до цепочки в 5-6 классов и ты явно не видишь инициализаций

Алексей
15.06.2018
10:45:58
ну тут всё правильно, Foo - родитель, Bar - потомок

Сергей
15.06.2018
10:46:01
так да

Дмитрий
15.06.2018
10:46:03
правда его спрятать в HOC можно
Это называется альтернативным решением

Alexander
15.06.2018
10:46:07
давно это было =) Да, вот ровно так и можно =)

Сергей
15.06.2018
10:46:21
и у кого

Алексей
15.06.2018
10:46:34
ну вот глубокое наследование как правило как раз и приносит проблемы

Сергей
15.06.2018
10:46:51
я пока не видел больших проектов на плюсах, без него

особенно игровые движки этим грешат

Алексей
15.06.2018
10:47:14
хм

но в принципе на производительность глубокое наследование особо и не влияет

а это для крестовиков самое главное

Дмитрий
15.06.2018
10:48:01
ну вот глубокое наследование как правило как раз и приносит проблемы
Как определить, что наследование достаточно глубокое

Алексей
15.06.2018
10:48:07
я бы даже сказал "почти не влияет"

Google
Алексей
15.06.2018
10:49:07
Как определить, что наследование достаточно глубокое
ну вот родитель-ребёнок1 явно нельзя назвать глубоким, родитель-ребёнок1-ребёнок2 - уже чуть хуже, но думаю терпимо, а вот глубже - уже пожалуй стоит избегать

Alexander
15.06.2018
10:49:07
Опосредованно -- влияет. У тебя появляется куча кода, которая выполняется просто потому, что "базовый класс недостаточно базовый и несет на себе лишний базовый функционал". И это "просачивается" в наследников.

Кроме того, у тебя появляется ситуация, когда ты не совсем понимаешь, как именно будет вести себя объект, который ты наследуешь -- по тем же причинам -- и ты слишком легко можешь ОШИБИТЬСЯ про оценке

Алексей
15.06.2018
10:50:06
не, Object не учитывается

там в основном служебная функциональность и она достаточно редко переопределяется

к тому же в тех же крестах нет Object или другого базового для всех класса

Но вот я не уверен, что хорошо получится, если избавиться от наследования почти полностью, заменив его композицией

по крайней мере не во всех ситуациях точно

Alexander
15.06.2018
10:53:34
блин. Да не бывает серебряной пули, нигде и никогда. Заменить везде по всему миру? Точно говно получится, инфа 100%. Заменить в твоём личном проекте? Ну, покажи проект сначала

Наследование, композиция, включение, ..., много их -- это замечательные инструменты, которыми стоит пользоваться тогда, когда надо. Рассуждать про то, что "молоток лучше гвоздодёра" -- глупо. Использовать молоток вместо гвоздодёра потому, что "молотки -- отстой" -- еще больший идиотизм

Сергей
15.06.2018
10:55:32
Alexander
15.06.2018
10:56:13
динамическая диспетчеризация влияет же
почти нет. Ты вынужден создать по лишней хеш-таблице на каждый тип (не экземпляр!), и всё. Проседания по быстродействию -- +1 JUMP, по памяти тоже несерьёзно

Алексей
15.06.2018
10:56:28
динамическая диспетчеризация влияет же
Насколько я понимаю, она не становится медленней с увеличением глубины наследования.

Alexander
15.06.2018
10:56:50
не становится.

(ну, не ты вынужден, а компилятор, разумеется)

Сергей
15.06.2018
10:57:39
почти нет. Ты вынужден создать по лишней хеш-таблице на каждый тип (не экземпляр!), и всё. Проседания по быстродействию -- +1 JUMP, по памяти тоже несерьёзно
я могу ошибаться, и поищу пруфы, но видел прожект, где это становилось проблемой (тож игровой движок) когда наследование очень глубокое

Алексей
15.06.2018
10:57:57
или что-то такое

John
15.06.2018
10:58:11
ребята, может есть у кого на примете англоговорящее кромьюнити по ts в телеграме?

Страница 655 из 669