Eternal_Shield
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору xpin2013 Цитата: Попытался. Что-то я не понимаю. | Class helper'ы не работают для генериков. Если вы зацепились за слово хелпер, то применитольно к структуре имел я ввиду не прямо хелпер class/record helper for, а в смысле тип-сателит, т.е. просто отдельный тип в котором реализованы общие методы. Что касается вашего примера, то моя идея примерно такая была: Имеем: Код: TMyList<T> = class ... protected procedure A; procedure B; procedure C; public procedure Add(const Value: T); end; TMyListString = class (TMyList<String>); TMyListInteger = class (TMyList<Integer>); TMyListPointer = class (TMyList<Pointer>); | При таком раскладе будет создано 3 новых типа с полным копированием родителя, то есть методы A,B,C перекочуют в наследников в полном виде вместе в методом Add. Чтобы исключить в наследниках повтор методов A, B, C надо их выделить либо в non-generic родителя, либо в любой внешний класс/структуру. Например так: Код: TMyListBaseClass = class abstract protected procedure A; procedure B; procedure C; end; TMyList<T> = class (TMyListBaseClass) public procedure Add(const Value: T); end; TMyListString = class (TMyList<String>); TMyListInteger = class (TMyList<Integer>); TMyListPointer = class (TMyList<Pointer>); | Во втором случае, исполняемый файл уже будет меньше в размере, т.к. методы A, B, C уже не дублируются. И чем толще "пересекающиеся" методы, тем больше экономии будет. Если интересно, то поэксперементируйте. В зависиммости от толщины "пересекающихся" методов у вас будут замечательные результаты. Особенно, если у одного generic родителя наследников много. Вот такая вот особенность реализации генериков в Делфи: классы-наследники не диференциальны, а fixed; Цитата: А нечего было Barry обижать. | А Барри-кун тоже не вечен. Замены то нет. Если уже вот таких "магов" до кода допускают, то ситуация в ем-ро полный швах. Добавлено: xpin2013 А да, ещё не забывайте, что одно и тоже объявление Код: TMyListString = class (TMyList<String>); | в разных юнитах считается разными типами ... ну вы поняли намек |