Текущий архив: 2015.09.10;
Скачать: CL | DM;
Вниз
Родить объект Найти похожие ветки
← →
Pavia © (2014-11-30 01:01) [0]Как правильно родить(породить) объект от предка?
Такой код создаст дубликат NodeLexeme: TASTNodeLexeme? Увеличит счётчик ссылок? Или так как const просто присвоит указатель без увеличения счётчика?// Описание классов
TASTComment=class(TASTNodeLexeme)
private
{ private declarations }
FType:(ctUndefine,ctShot,ctLong,ctMacros);
procedure SetCommentType(const Text:String);
protected
{ protected declarations }
public
{ public declarations }
constructor Create(const NodeLexeme:TASTNodeLexeme); Overload;
constructor Create(const Text:String); Overload;
published
{ published declarations }
end;
// Реализация
constructor TASTComment.Create(const NodeLexeme: TASTNodeLexeme);
begin
TASTNodeLexeme(Self):=Lexeme; // Это правильно ??
FCommentType:=ctUndefine;
SetCommentType(Self.Lexeme)
end;
← →
Pavia © (2014-11-30 01:05) [1]О печатался FType вверху это FCommentType. Вернее пока ещё не определился с название.
← →
Pavia © (2014-11-30 01:05) [2]О печатался FType вверху это FCommentType. Вернее пока ещё не определился с название.
← →
junglecat © (2014-11-30 11:32) [3]> TASTNodeLexeme(Self):=Lexeme; // Это правильно ??
неправильно.
Здесь напрашивается inherited с параметрами конструктора TASTNodeLexeme, если есть.
ctUndefine,ctShot => ctUndefined, ctShort?
Хотя, камент иногда может быть как выстрел...
← →
Pavia © (2014-11-30 12:15) [4]
> Здесь напрашивается inherited с параметрами конструктора
> TASTNodeLexeme, если есть.
Тогда придется копировать все поля поле в поле что хотелось бы избежать.
← →
junglecat © (2014-11-30 13:24) [5]
TASTNodeLexeme = class(TPersistent)
procedure AssignTo; override;
end;
procedure TASTNodeLexeme.AssignTo(Dest: TPersistent);
begin
if Dest is TASTNodeLexeme then begin
with TASTNodeLexeme(Dest) do begin
CommentType := Self.CommentType;
...
end;
end else
inherited AssignTo(Dest);
end;
← →
Pavia © (2014-11-30 15:29) [6]
> TASTNodeLexeme = class(TPersistent) procedure AssignTo;
> override;end;procedure TASTNodeLexeme.AssignTo(Dest: TPersistent);
> begin if Dest is TASTNodeLexeme then begin with TASTNodeLexeme(Dest)
> do begin CommentType := Self.CommentType; ...
> end; end else inherited AssignTo(Dest);end;
Вот именно этого и хотелось избежать.
← →
junglecat © (2014-11-30 15:37) [7]а какие еще варианты? RTTI подходит только для published-свойств, копирование блока памяти, типа MoveMemory, чревато при наличии управляемых типов
← →
Kerk © (2014-11-30 17:52) [8]RTTI не только для published-свойств нынче подходит.
Но в целом тут какое-то желание странного наблюдается.
И про счетчик ссылок вопросы выглядят очень странно. Нужно компилятор уточнить.
← →
Pavia © (2014-11-30 19:51) [9]
> И про счетчик ссылок вопросы выглядят очень странно. Нужно
> компилятор уточнить.
D7-XE7
FPC 2014
> Но в целом тут какое-то желание странного наблюдается.
А по моему это нормальное желание написать 1 строчку вместо десятка.
← →
Kerk © (2014-11-30 19:57) [10]
> D7-XE7
> FPC 2014
Где ж ты тогда нашёл у классов счётчик ссылок?
← →
Pavia © (2014-11-30 21:36) [11]К примеру вот тут.
http://docwiki.embarcadero.com/RADStudio/XE7/en/Using_Reference_Counting
← →
Pavia © (2014-11-30 21:37) [12]Даже вот так
http://docwiki.embarcadero.com/RADStudio/XE7/en/Automatic_Reference_Counting_in_Delphi_Mobile_Compilers
← →
junglecat © (2014-11-30 21:42) [13]> [11] Pavia © (30.11.14 21:36)
TASTNodeLexeme наследуется от TInterfacedObject?
← →
Kerk © (2014-11-30 21:53) [14]
> Pavia ©
А в D7 это есть, сам-то как думаешь? :)
Это появилось совсем недавно (в XE4, кажется?) и то не для всех платформ.
← →
Pavia © (2014-11-30 22:00) [15]
> TASTNodeLexeme наследуется от TInterfacedObject?
Наследуется от TObject; Смотри ссылку в [12] сообщении.
Там есть счётчик ссылок, можете сами в систем проверить. Насколько понял по умолчанию для десктопа выключен. Включается командой. {$AUTOREFCOUNT}
Судя по всему вопрос совместимости с компонентами поэтому выключен.
По ссылке в [11] в случае "const" не работает.
TASTNodeLexeme(Self):=Lexeme;
Строчка допустимая. Но в случае разрушения Lexeme имеем утечку так?
Надо создавать CopyTo или AssignTo.
Если добавить AssignTo будет работать код ниже?
(Self as TASTNodeLexeme):=Lexeme;
← →
Ega23 © (2014-11-30 22:03) [16]
> К примеру вот тут.
А твой TASTNodeLexeme реализует интерфейсы?
← →
junglecat © (2014-11-30 22:10) [17]> Если добавить AssignTo будет работать код ниже?
> (Self as TASTNodeLexeme):=Lexeme;
эти две вещи никак не связаны.
не говоря уже о том, что 2-я строчка просто не скомпилиццо
← →
Kerk © (2014-11-30 22:12) [18]
> Pavia © (30.11.14 22:00) [15]
> Насколько понял по умолчанию для десктопа выключен. Включается
> командой. {$AUTOREFCOUNT}
Удалось включить? :)
← →
Pavia © (2014-11-30 22:17) [19]
> А в D7 это есть, сам-то как думаешь? :)
Знаю что нет. Вопрос был скорее про новые компиляторы, которые я не знаю. Сейчас ответ нашел.
Тема ООП для меня новая. Как бы я знал, что оно есть. Но глубокое погружение впервые. Просто задачу придумал впервые, где есть всё: тут и наследование и мутация и капсулирование и интерфейсы и другие вещи.
Поэтому вопросы может и простые, но знаний таких нет. Да и в книжках это как-то не описано. Приходится искать, читать, думать.
← →
Pavia © (2014-11-30 22:22) [20]
> А твой TASTNodeLexeme реализует интерфейсы?
TASTNodeLexeme - пока только заглушка. Далее думаю над интерфейсами.
> Удалось включить? :)
Пока хочу написать весь модуль, а там классов много.
Как допишу буду пробовать.
← →
Ega23 © (2014-11-30 22:25) [21]Смешались в кучу кони, люди...
← →
Kerk © (2014-11-30 22:25) [22]
> Пока хочу написать весь модуль, а там классов много.
> Как допишу буду пробовать.
Поверь мне на слово, что на десктопе счетчика ссылок у классов нет. Много времени сэкономишь. Ну или напиши маленький тестовый пример, чтобы проверить.
Так уж сложилось, что мобильный и десктопный компиляторы Delphi отличаются. Счетчик ссылок - не единственное отличие.
Если очень нужен счетчик ссылок, просто возьми интерфейсы.
← →
Pavia © (2014-11-30 23:15) [23]
> Смешались в кучу кони, люди...
Да, вы верно заметили.
Да там в куче ещё много всего и всех. ;-)
Такой вопрос про шаблоны книгу четырёх кто нибудь читал?
Читать стоит?
Сейчас читаю книгу "Кэнту М.-Delphi7 для проффесионалов (2004)." Как всегда не о чём, но нашел новый элемент мозаики.
В VCL используется шаблон Model–view–controller (MVC)
Так вот controller (в VCL TControl) осуществляет освобождением компонентов модели (TComponent).
Надо будет определить, кто контролирует объекты. Извне или изнутри или сами себя при помощи счётчика ссылок. Надо подумать.
← →
junglecat © (2014-11-30 23:19) [24]> В VCL используется шаблон Model–view–controller (MVC)
как много нам открытий чудных...
← →
Игорь Шевченко © (2014-12-01 10:21) [25]
> Такой вопрос про шаблоны книгу четырёх кто нибудь читал?
>
> Читать стоит?
Стоит.
← →
Andryk © (2014-12-01 14:04) [26]
> Pavia © (30.11.14 23:15) [23]
> Такой вопрос про шаблоны книгу четырёх кто нибудь читал?
>
> Читать стоит?
Не просто стоит а обязательно к прочтению, просто очень много времени в итоге сэкономишь на придумывании того, что уже не раз придумали до тебя
Вот кстати хороший ресурс, правда тут нет дельфи, но я и по дельфи встречал ресурсы.
http://www.oodesign.com/
← →
DVM © (2014-12-01 14:31) [27]
> junglecat © (30.11.14 23:19) [24]
> > В VCL используется шаблон Model–view–controller (MVC)
>
> как много нам открытий чудных...
Вид, я так понимаю - это dfm файл формы. Контроллер это класс формы, ну а что, действительно он пользовательский ввод обрабатывает, вывод осуществляет. Насчет модели только вот затруднительно однозначно сказать.
На практике же получается в контроллере дикая помесь сущностей представления, логики и всего на свете.
← →
junglecat © (2014-12-01 14:38) [28]> Вид, я так понимаю - это dfm файл формы. Контроллер это
> класс формы
MVC предполагает, что M, V и C - независимые (и, возможно, даже написанные на разных языках) компоненты, которые могут использоваться раздельно и в различных сочетаниях.
Форма VCL и вообще любой контрол - монолит, т.е. содержит в себе и view (сам dfm, либо то, что мы видим на форме) и контроллер - обработчики событий.
Ну, в качестве И.О. модели можно с натяжкой представить компоненты доступа к данным типа потомков TDataSet.
← →
DVM © (2014-12-01 14:44) [29]
> junglecat © (01.12.14 14:38) [28]
> Ну, в качестве И.О. модели можно с натяжкой представить
> компоненты доступа к данным типа потомков TDataSet.
Да там и все остальное с натяжкой. Какие то зачатки MVC просматриваются, но, да слишком большая связность. А как бы было хорошо, если бы VCL действительно реализовывала полностью принцип MVC: хочешь обычное приложение, хочешь веб, хочешь один движок представлений, хочешь другой.
← →
картман © (2014-12-01 15:22) [30]теории они такие теории
← →
Pavia © (2014-12-01 15:59) [31]
> теории они такие теории
Программирование - это гуманитарная наука.
Что обзывать узлом графа и как делить решает каждый сам.
Шаблоны не обязан быть, строится на объектах. Но на них удобнее.
В принципе узлами графа можно обозвать не объект, а функцию.
Дело в том что MVC не тот шаблон который мне нужен.
У меня есть данные лексемы. Несколько форматов представления. Список, сложное-дерево, троичное-дерево.
Сложные трансформер(парсер) и простые трансформаторы(модификаторы).
Не вижу кого здесь можно назвать контроллером. Можно конечно класс дерево и класс список назвать контроллерами. И пусть за целосностью данных следят. А можно на основе подсчёта ссылок сделать чтобы каждый объект следил сам.
Как в объекте объединен код и данные так и я хочу объединить дерево и код управления им.
← →
Inovet © (2014-12-01 16:12) [32]> [31] Pavia © (01.12.14 15:59)
> В принципе узлами графа можно обозвать не объект, а функцию.
А можно и оператор if
> [31] Pavia © (01.12.14 15:59)
> А можно на основе подсчёта ссылок сделать чтобы каждый объект следил сам.
А можно и без подсчёта ссылок каждый раз проверять по всем узлам.
В общем гуманитарная и не наука - как скажешь, так и будет.
← →
junglecat © (2014-12-01 16:14) [33]а программирование - это вообще наука?
← →
Юрий Зотов © (2014-12-01 17:57) [34]> junglecat © (01.12.14 16:14) [33]
Практическое программирование - не наука. Так же, как изготовление детали на станке.
А всяческие "методы сортировки", "теории компиляторов" и иже с ними - наука. Так же, как инженерные науки, без которых ни станка, ни детали не сделаешь.
Страницы: 1 вся ветка
Текущий архив: 2015.09.10;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.044 c