Size: a a a

2020 April 13

ГМ

Геннадий Малинин in Delphi & Lazarus
Sergey Bodrov
Не хочется делать интерфейсы там, где достаточно record. Это для маршрутизатора на карте. Там десятки тысяч точек (перекрестков) и линий (дорог), которые могут быть с дополнительными извращениями (круговое движение, развязка, одностороннее движение, разводной мост, платная дорога, сезонная дорога, итд..). И нужно их как-то в один общий список запихать. В С++ типизация мягкая, утиная, по совпадению методов, причем даже не по сигнатуре, а по размеру параметров. То есть запросто можно положить шило, а взять мыло. И на Паскаль эти извраты непросто перевести.
Так у тебя и так TVader - класс
источник

VA

Viktor Akselrod in Delphi & Lazarus
Sergey Bodrov
Не хочется делать интерфейсы там, где достаточно record. Это для маршрутизатора на карте. Там десятки тысяч точек (перекрестков) и линий (дорог), которые могут быть с дополнительными извращениями (круговое движение, развязка, одностороннее движение, разводной мост, платная дорога, сезонная дорога, итд..). И нужно их как-то в один общий список запихать. В С++ типизация мягкая, утиная, по совпадению методов, причем даже не по сигнатуре, а по размеру параметров. То есть запросто можно положить шило, а взять мыло. И на Паскаль эти извраты непросто перевести.
источник

SB

Sergey Bodrov in Delphi & Lazarus
Да, оно самое. Но это в крайнем случае, для глубокой оптимизации. Классы понятнее и удобнее.
источник

VA

Viktor Akselrod in Delphi & Lazarus
Sergey Bodrov
Да, оно самое. Но это в крайнем случае, для глубокой оптимизации. Классы понятнее и удобнее.
ты же сам написал  где достаточно record
источник

SB

Sergey Bodrov in Delphi & Lazarus
Viktor Akselrod
ты же сам написал  где достаточно record
Дело в том, что "извращения" составляют очень малую часть, и хранить в памяти резервные поля записей ради них будет несколько избыточно.
источник

SB

Sergey Bodrov in Delphi & Lazarus
Так что возникает выбор, потратить больше памяти на record или потратить больше тактов процессора на class.
источник

AS

Alexey Shumkin in Delphi & Lazarus
Sergey Bodrov
Так что возникает выбор, потратить больше памяти на record или потратить больше тактов процессора на class.
преждевременная оптимизация? понимаю )))
источник

G

Garik in Delphi & Lazarus
Sergey Bodrov
Есть два класса, `TVader = class` и `TLuke = class(TVader)`. И для них есть TSkywalkerList = TList<T>. Можно ли ограничить лист только классами TVader и TLuke, или для них нужно создавать интерфейс?
в чем проблема проверять тип при добавлении в список?
источник

GB

George Bakhtadze in Delphi & Lazarus
Sergey Bodrov
Не хочется делать интерфейсы там, где достаточно record. Это для маршрутизатора на карте. Там десятки тысяч точек (перекрестков) и линий (дорог), которые могут быть с дополнительными извращениями (круговое движение, развязка, одностороннее движение, разводной мост, платная дорога, сезонная дорога, итд..). И нужно их как-то в один общий список запихать. В С++ типизация мягкая, утиная, по совпадению методов, причем даже не по сигнатуре, а по размеру параметров. То есть запросто можно положить шило, а взять мыло. И на Паскаль эти извраты непросто перевести.
какая тут связь с ограничением типа-параметра? ограничиваешь родительским классом TVader и используешь его методы. я бы интерфейсом ограничил.
В FPC, кстати, женерики работают похожим на C++ образом. Т.е. синтаксис проверяется после специализации, что дает возможность писать более обобщенный код чем в дельфи, где женерик проверяется до специализации. Видимо, хотели компилировать на этом этапе, дабы избежать дублирования машинного кода.
источник

W

Wlad in Delphi & Lazarus
Sergey Bodrov
Не хочется делать интерфейсы там, где достаточно record. Это для маршрутизатора на карте. Там десятки тысяч точек (перекрестков) и линий (дорог), которые могут быть с дополнительными извращениями (круговое движение, развязка, одностороннее движение, разводной мост, платная дорога, сезонная дорога, итд..). И нужно их как-то в один общий список запихать. В С++ типизация мягкая, утиная, по совпадению методов, причем даже не по сигнатуре, а по размеру параметров. То есть запросто можно положить шило, а взять мыло. И на Паскаль эти извраты непросто перевести.
По-правильному, ну, в смысле "в идеале", вся архитектура должна из одних интерфейсов и абстрактных классов состоять...
источник

SB

Sergey Bodrov in Delphi & Lazarus
Garik
в чем проблема проверять тип при добавлении в список?
С добавлением в список проблем никаких. Проблемы при обращению к свойствам/методам элемента списка. Если заранее предусмотреть некий общий класс/интерфейс для хранимых элементов, то нет смысла в женерике. А напихать в женерик-контейнер разные неродственные классы нельзя.
источник

SB

Sergey Bodrov in Delphi & Lazarus
Wlad
По-правильному, ну, в смысле "в идеале", вся архитектура должна из одних интерфейсов и абстрактных классов состоять...
Полностью согласен. Но к сожалению, в паскале абстрактные классы и интерфейсы это слишком разные вещи. Частично совместимые по типу, и не взаимозаменяемые.
источник

W

Wlad in Delphi & Lazarus
Sergey Bodrov
Полностью согласен. Но к сожалению, в паскале абстрактные классы и интерфейсы это слишком разные вещи. Частично совместимые по типу, и не взаимозаменяемые.
Там, так понял, со списками в вопросе, есть ещё трудности с пониманием, ЗАЧЕМ этот список именно в этом месте используется.
Понятно, что в Дельфи чистую MVC не построишь, но смысл остаётся.
источник

SB

Sergey Bodrov in Delphi & Lazarus
generic TDataFile<T> = class(TObject) 
 function GetByOffset(AOffset: TFileOffset; var AEntry: T): Boolean;
 function GetByOffset(AOffset: TFileOffset; ACount: Integer;
     var AData: array of T): Boolean; overload;
end;
TAreaDataFile = specialize TDataFile<TMapArea>;
TNodeDataFile = specialize TDataFile<TMapNode>;
TWayDataFile = specialize TDataFile<TMapWay>;
(синтаксис FPC)
источник

SB

Sergey Bodrov in Delphi & Lazarus
А нужен всего один общий класс.
источник

SB

Sergey Bodrov in Delphi & Lazarus
Потому что файл один и тот же
источник

GB

George Bakhtadze in Delphi & Lazarus
Sergey Bodrov
Потому что файл один и тот же
файл может и тот же, но рассматриваешь ты его по-разному. для чего вполне нормально использовать 3 класса. все верно написано
источник

SB

Sergey Bodrov in Delphi & Lazarus
И еще хотелось бы избавиться от array of T в пользу класса-списка.
источник

GB

George Bakhtadze in Delphi & Lazarus
Sergey Bodrov
И еще хотелось бы избавиться от array of T в пользу класса-списка.
поэтому интерфейс тут подойдет лучше всего. вложенные специализации насколько помню FPC пока не поддерживает, т.е. TList<T> не компилируется?
источник

SB

Sergey Bodrov in Delphi & Lazarus
George Bakhtadze
поэтому интерфейс тут подойдет лучше всего. вложенные специализации насколько помню FPC пока не поддерживает, т.е. TList<T> не компилируется?
Даже пробовать боюсь, как будет вложенная специализация работать. =)
источник