Множественное наследование

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Множественное наследование

Сообщение sts » 24.11.2010 02:11:58

Кто нибудь копал на тему реализации в компиляторе (умеренного) множественного наследования?
Это одна из вещей которых мне иногда не хватает, с копи пастом некрасиво получается, да и править неудобно.
sts
постоялец
 
Сообщения: 451
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Множественное наследование

Сообщение Kitayets » 24.11.2010 02:23:42

множественное наследование ж признано злом? Тем более в objfpc все классы от TObject наследуются, тогда нужно и виртуальное наследование придумывать.

есть интерфейсы - их и нужно использовать, заодно не будет потом мучительно больно приспосабливаться к java, C#, delphi, perl, php5+, python и другим современным ООП ЯП.

как говорят классики - если вам нужно множественное наследование, то у вас что-то не то с дизайном.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Множественное наследование

Сообщение perlpunk » 24.11.2010 02:39:44

sts писал(а):Кто нибудь копал на тему реализации в компиляторе (умеренного) множественного наследования?
Это одна из вещей которых мне иногда не хватает, с копи пастом некрасиво получается, да и править неудобно.


А чем плоха агрегация? или делегирование еще например.
perlpunk
новенький
 
Сообщения: 90
Зарегистрирован: 26.09.2008 21:19:48

Re: Множественное наследование

Сообщение sts » 24.11.2010 03:01:37

fpc поддерживает делегирование? делегирование, насколько помню частный случай множественного наследования, по сути то что чаще нужно.

агрегация несколько криво, например есть TForm1 и TTreeNode (как пример степени различия классов) нужно добавить методысвойства получения прав доступа к этим объектам, создаем класс TAccessRight с кучкой методов по получению прав, заводим у TForm1 и TTreeNode - FAccessRight: TAccessRight, объявляем пропертю AccessRight, в Create Destroy создаемудаляем FAccessRight, далее в процессе использование пишем Form1.AccessRight.getAccessRight(...)

и это вместо того чтоб написать TForm1 = class(TForm, TAccessRight) а в коде Form1.getAccessRight(...)

Добавлено спустя 2 минуты 59 секунд:
интерфейсы мало того что тормознее, так еще больше порождают копипаста и соответственно еще более желательно мнж. наследование

Добавлено спустя 7 минут 34 секунды:
как говорят классики - если вам нужно множественное наследование, то у вас что-то не то с дизайном.

классики просто теоретики а на практике ты имеешь уже предопределенную иерархию классов в которую не можешь вмешаться, грубо говоря, добавить в TPersistent метод getAccessRight (хотя в fpc laz это можно но не приветствуется)
sts
постоялец
 
Сообщения: 451
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Множественное наследование

Сообщение stikriz » 24.11.2010 09:27:42

sts писал(а):классики просто теоретики а на практике ты имеешь уже предопределенную иерархию классов в которую не можешь вмешаться, грубо говоря, добавить в TPersistent метод getAccessRight (хотя в fpc laz это можно но не приветствуется)


Были бы хелперы как в дельфи...
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

Re: Множественное наследование

Сообщение sts » 24.11.2010 10:53:34

хелперы тоже нужны, к томуже в реализации это значительно проще (которые как в делфи) так как добаляют только методы, а если еще и поля добавлять вообще былобы отлично и нетак сложно как с мнж наследованием

Добавлено спустя 2 часа 48 минут 41 секунду:
Все читаете и читаете (тему), нет бы написали чего нибудь...

Самое забавное что в fpc уже есть все необходимые механизмы для реализации (ограниченного) мнж наследования, например, решим выше указанную задачу через интерфейсы:
объявляем интерфейс IAccessRight с методом getAccessRight(...) далее делаем
TForm1 = class(TForm, IAccessRight) и реализуем его (интерфейс) через FAccessRight класс TAccessRight (1) так как getAccessRight(...) сложен и в нем используется кучка приватных методов, ну или тупо реализуем их в TForm1(2) а в TTreeNode1 копипастим.

Недостатоки первого варианта: нельзя (при Form1: TForm1) написать Form1.getAccessRight(...) а можно либо Form1.FAccessRight.getAccessRight(...) либо (Form1 as IAccessRight).getAccessRight(...) оба выглядят криво, также если нужны разные реализации getAccessRight(...) надо придумывать механизмы чтоб TAccessRight это учитывал.

Во втором вызовы прямые но копипаст все портит, при изменении интерфейса много править.

А теперь представим следующую реализацию мнж наследования, объявляем:
TAccessRight = class и TForm1 = class(TForm, TAccessRight), компилятор смотрит — оба-на в TForm1 вторым указан класс TAccessRight, он автоматом объявляет интерфейс с тем-же именем и копирует реализацию из TAccessRight в TForm1 в итоге вместо TForm1 = class(TForm, TAccessRight) получаем TForm1 = class(TForm, TAccessRight-интерфейс) плюс поля и методы (которые вставляется перед собственными TForm1), более того методы из TAccessRight (технически) можно оверрайдить. Получаем как раз второй вариант решения, но гораздо меньше писать кода и т.д.

Оператор AS немного надо будет переделать, т.е., при (Form1 as TAccessRight) хоть и известно что TAccessRight класс но если в предках его не найдено то надо поискать в таблице интерфейсов с тем-же именем (IS аналогично)

И все нормально, в рамках текущих структур данных (VMT и т.д.)

Так что тезис - мнж наследование — зло - это от неграмотности.
sts
постоялец
 
Сообщения: 451
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Множественное наследование

Сообщение stikriz » 24.11.2010 15:05:03

sts писал(а):Самое забавное что в fpc уже есть все необходимые механизмы для реализации (ограниченного) мнж наследования

Cамое забавное, что если будет реализовано мн. наследование, что очень вряд-ли, то вот так делать точно не будут. Я думаю, не у кого нет сомнений, что реализовали бы и нет недопонимания как. Есть понимание, что не нужно.
sts писал(а):Так что тезис - мнж наследование — зло - это от неграмотности.

Нет. От опыта вылавливания багов, я думаю. Хотя... Пусть бы было - ни кто не заставляет множественно наследоваться.
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

Re: Множественное наследование

Сообщение sts » 24.11.2010 15:58:44

Не важно как будет если будет, суть втом что уже сейчас можно сделать так и закроются все ситуации с которыми сталкивался я.

По мне так сокращение кода в разы значительно более снижает количество багов, чем гипотетические баги мнж наследования, в первом случае я не могу сократить код и будет реальное пространство для возникновения багов в процессе разработки, а во втором будет место для маневра и их минимизации.
sts
постоялец
 
Сообщения: 451
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Множественное наследование

Сообщение Kitayets » 24.11.2010 16:49:54

sts

короче Вам хочется лишнего сахара... в "objectPascal" его и так выше меры.

используйте interface и делегирование с агрегацией, как Вы описали выше и как это было задумано изначально.

Лишнего кода минимум.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Множественное наследование

Сообщение sts » 24.11.2010 17:27:51

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

Добавлено спустя 5 минут 10 секунд:
вот по этому в LCL и получается удвоение экземпляров классов - как недостаток сахара
sts
постоялец
 
Сообщения: 451
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Множественное наследование

Сообщение perlpunk » 24.11.2010 19:44:09

Если очень надо - лучше это сделать на уровне IDE или макроподстановки.
Если начнут в компилятор это встраивать, то он станет тормозной и сложный как с++
perlpunk
новенький
 
Сообщения: 90
Зарегистрирован: 26.09.2008 21:19:48

Re: Множественное наследование

Сообщение hinst » 24.11.2010 20:36:17

ОП, This is... PASCAL!!! :twisted:
это я так, на случай, если вы с чем-то путаете
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Множественное наследование

Сообщение Odyssey » 24.11.2010 22:00:23

Хм.. А если способ связи форм и прав доступа позволит такое сделать, то как насчёт AccessManager.GetAccessRight(Form1, ...), или даже просто GetAccessRight(Form1, ...)? Т.е. вынести методы работы с правами доступа из классов? При этом теоретически классы могут всё также реализовать интерфейсы, и GetAccessRight(Form1, ...) -- служить синтаксическим сахаром для (Form1 as IAccessRight).getAccessRight(...).
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Множественное наследование

Сообщение sts » 24.11.2010 22:27:41

hinst писал(а):ОП, This is... PASCAL!!! :twisted:
это я так, на случай, если вы с чем-то путаете

ну речь идет о Object Pascal, и неплохо было бы чтобы он развивался

Особенно если надо для 15 классов (описывающих предметную область) сделать списки на основе TList, как-то напрягает делать 15 копий одного и того же, меняя только типы некоторых методов, и это вместо одного класса TList<E> .
Последний раз редактировалось sts 24.11.2010 22:33:12, всего редактировалось 1 раз.
sts
постоялец
 
Сообщения: 451
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Множественное наследование

Сообщение Max Rusov » 24.11.2010 22:31:49

perlpunk писал(а):Если начнут в компилятор это встраивать, то он станет тормозной и сложный как с++

В контексте FPC это звучит как издевательство.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru