Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];

Вниз

Родить объект   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.053 c
1-1331096953
ssmplec
2012-03-07 09:09
2015.09.10
Проблема с cxGrid RepositoryItem


2-1393479979
Васька
2014-02-27 09:46
2015.09.10
Переключение между дочерними окнами


15-1415007687
Trylok
2014-11-03 12:41
2015.09.10
Перевод специальности диплома на англ. язык


15-1417575009
bems
2014-12-03 05:50
2015.09.10
Ночные странности


2-1390997184
JohnKorsh
2014-01-29 16:06
2015.09.10
Удаление файла средствами Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский