виртуален дизайнер

добър ден
Обяснете новак, PLZ, че е виртуален конструктор и как да го използвате

Това е виртуален чук, виртуални pasatizhi т.н.


> Обяснете за начинаещи

за начинаещи не трябва да започва с бомбардирането на форума.

строителя не може да бъде виртуален.
Това няма смисъл.

> KSergey
погрешно.
TComponent.Create


> То няма смисъл

Аз ще знам. И тогава всичко употреба и използване.

Един пример за ползата от виртуални дизайнери (може би единственият, който - поне аз разбрах смисъла на това в този случай) - е да ги използвате във връзка с metaclasses.

Например,
Var
MetaClass: Чклас;
Obj: TObject;
започвам
MetaClass: =. А клас с виртуална Създаване, например, се предава като параметър.
Obj: = MetaClass.Create;
Сега можем да се реши в изпълнение, клас обект е създаден, а това ще се нарича дясното дизайнера.

Конструктор Създаване; виртуален;
Потребителите не трябва да ги и тази възможност.
Обикновено виртуални конструктори се използват заедно с класа на определение на;

Това означава, че се създаде един вид семейство от класове.
TMyBase = клас
.
конструктор Създаване; виртуален;
приключи;

TMyBaseClass = клас TMyBase;

TMyCoolClass1 = клас (TMyBase)
.
конструктор Създаване; отменят;
приключи;

TMyCoolClass2 = клас (TMyBase);
.
конструктор Създаване; отменят;
приключи;

TMyVeryCoolClass1 = клас (TMyCoolClass1);
.
конструктор Създаване; отменят;
приключи;

функция CreateClass (Var AObject: TMyBase; AClass: TMyBaseClass);
започвам
AObject: = AClass.Create;
приключи;
Тя ще се нарича точно виртуален конструктор, който е посочен на AClass класа връзка.

Аз не знам как сте, новак, както казвате, са наясно с гъвкавостта, осигурена, но изведнъж осъзнаваш. Можете да прочетете TCollection източник, ако вие ще разберете.

Най-простият пример е базиран на гореизложеното.
Да предположим, че формата ще има три бутона.
Button_CoolClass1
Button_CoolClass2
Button_VeryCoolClass1
Ще бъдат създадени обекти на класовете, в които OnClick. Вместо да се налага да пиша три различни OnClick събитие, можете да напишете само един.

тип
TForm1 = клас (TForm)
.
Процедура FormCreate (Sender: TObject);
частен
Процедура SomeButtonClick (Sender: TObject);
MyObject: TMyBase;
приключи;

Процедура TForm1.FormCreate (Sender: TObject);
започвам
опитвам
TButton (FindComponent ( "Button_CoolClass1")) Tag: = цяло число (TMyCoolClass1) ;.
TButton (FindComponent ( "Button_CoolClass2")) Tag: = цяло число (TMyCoolClass2) ;.
TButton (FindComponent ( "Button_VeryCoolClass1")) Tag: = цяло число (TMyVeryCo olClass1) ;.
с изключение на
приключи;
приключи;

По мое мнение нищо не е забравено.
И сега, ако изведнъж имаме в семейството ще има друг клас, а след изпълнението му ще бъде много проста.

Така че, добре.
И как те могат да се възползват от, аз се чудя? Когато един обект е създаден по различен начин, който по класа на обекта, който искате да се готви. И така, как да го виртуалността може да се използва? Мен в главата не се изкачи подходящ.


> Конструктор на обекта не може да бъде виртуален.
> Това няма смисъл.

Може би имат предвид хората,
TObjectName.Sreate конструктор; виртуален;
След това е много логично

Да, забравих да зададете манипулатор:

Процедура TForm1.FormCreate (Sender: TObject);
започвам
опитвам
С TButton (FindComponent ( "Button_CoolClass1")) правя
започвам
Tag: = цяло число (TMyCoolClass1);
OnClick: = @ SomeButtonClick;
приключи;
С TButton (FindComponent ( "Button_CoolClass2")) правя
започвам
Tag: = цяло число (TMyCoolClass2);
OnClick: = @ SomeButtonClick;
приключи;
С TButton (FindComponent ( "Button_VeryCoolClass1")) правя
започвам
Tag: = цяло число (TMyVeryCoolClass1);
OnClick: = @ SomeButtonClick;
приключи;
с изключение на
приключи;
приключи;

+ dvizhek офлайн пространства navstavlyal :)

За всеки случай:

> KSergey
Освен вече споменатите, ще отбележа, Application.CreateForm.
И като цяло резби Delphi система се основава на използването на Вирт. Konstr. (См. TReader, например)

Те се бърка нещо. виртуален и динамичен начин на поставяне указател към метод в паметта.
Ако методът е описан като Виртуално, то тогава е възможно да се блокира потомък претоварване ти.

Необходимо е да се чете книгата си.
Но все пак аз не разбирам защо той виртуално. Когато един обект е действително създаден - ние вече знаем точно какво клас е то. Kakashi разлика: кодът е регистър или променлива атака през класа? Майната му, той е известен! Как тук виртуалност нещо използва?

> И как е възможно да се използва, аз се чудя? Когато един обект е създаден по различен начин, в класа

Ето един реален пример - от източника FPC компилатор.
Има tDLLScanner - клас виртуален конструктор Създаване, CDLLScanner - масив (елементи съответстват поддържаните платформи) тип елемент TDLLScannerClass = клас TDLLScanner.


ако (cs_create_smart в aktmoduleswitches) след това
започвам

ако има такъв (importssection) и
(Target_info.system в [system_i386_win32, system_i386_wdosx]), тогава
започвам
importsSection.clear;
importlib.generatesmartlib;
приключи;

GenerateAsm (истина);
ако target_asm.needar след това
Linker.MakeStaticLibrary;
приключи;

Като цяло, всички ползата от виртуални дизайнери могат да реализират само ако peresyadesh C ++ ;-)


> По принцип, всички ползата от виртуални дизайнери могат да реализират
> Само ако peresyadesh C ++ ;-)

Това, което те интересува в Делфи по-лошо?

Фактът, че те са в Делфи, поставени в C ++ и не ги има ;-))


>
>> Като цяло, всички ползата от виртуални дизайнери може
> Да се ​​признае,
>> Само ако peresyadesh C ++ ;-)
>
> Това, което те са по-лоши в Делфи интересно?

Миризма свещена война.

PS
обосновка, че, меко казано, седна в една локва би могло да бъде само на факта, че подробности за всички тези виртуализация прочетете само в книги за C ++, Delphi, и това по някакъв начин от самия него работи добре;)

> Virtual и динамичен начин на поставяне указател към метод в паметта.

И все пак по-скоро указатели към предците методи.

> Ако методът е описан като Виртуално, а след това в детето то може да бъде отрязан
> Претоварване ти.

1. "Замяна" - тази замяна, и претоварване - е съвсем друго.
2. Динамични методи се припокриват по същия начин, както и виртуалното. Разликата между тях не е най-важното.

Ммм, просто за по-голяма яснота, може да е полезно


> 1. "Замяна" - тази замяна, и претоварване - е съвсем друго.
> 2. Динамични методи припокриват по същия начин, както
> Virtual. Разликата между тях не е най-важното.

Грешка в написването на прост :)

След това е неправилна. Защото, ако методът е описан като динамичен, а след това потомък на неговия, също могат да бъдат обхванати от една и съща замяна "Ом.

О, знам всичко това от втората година, без колебание пише, съжалявам;)

Разбира се, че едва ли е възможно да се използват в практиката, но за разбирането на някои неща, IMHO полезно да се знае.

Сама по себе си по някакъв начин улавя отворен.
Имаше маси формати
-48 DynamicTable
-52 MethodTable
-56 FieldTable
-60 TypeInfo
-64 InitTable
-68 AutoTable
-72 IntfTable

Но, по дяволите, не мога да намеря. Аз дори приготвен статия, озаглавена "DELPHI вътре."
Да Хвърлих беше в миналото.


> system.pas

Да, и това е мястото, където трябва да гледаме :)

> И има някаква информация по този въпрос?
> И къде да го получа?

Всяка книга, която описва обекта Паскал.

> Всяка книга, която описва обекта Паскал.
Е, аз просто има такива;)

В Lishnere имат такава информация.


> Е, аз просто има такива;)

Аз не знам, всичко, което чета по тази причина не е правилно интерполация.

(Разбирам, че всичко това знам, но позволете ми да споделя моя радост)

Аз просто исках да задам един въпрос като:

2. Само трябва да бъда честен, аз не виждам докъде може да се окаже необходимо. Не е ясно за създаване на обект от този клас, който се записва в променлива. Въпреки това, според това колко от етапа на проектиране на заявлението, знам какво са възможни (не мога да си представя ситуация, в която аз не знам всички възможности, т.е., да, може да има условия, но трябва също така ясно и предписва на всички възможни опции за създаване на един или друг начин клас), и поради това - може би това е само хубави звънци и свирки, но не и повече? В смисъл, че той напълно да замени дизайна на формата:

случай, че на
1: MyObj: = TObj1.Create;
2: MyObj: = TObj2.Create;
3: MyObj: = TObj3.Create;
приключи;

Да, пиша това като нищо може да бъде, но искате хубава компактен и лесно може да се поднови код? След това не забравяйте аксиома, че някои задачи като "система за резби Делфи", трябва да се направи с виртуални конструктори.


> Въпреки това, според това колко на заявленията за проектиране на завършеност
> Знам какво са възможни всички варианти (аз не мога да си представя
> Подобна ситуация. Аз не знам; т.е. Да, може да бъде
> Условия, но аз също трябва ясно и предписват всички възможни варианти
> За да създадете един или друг начин клас

Ние имаме един прост зрител обекти класове raznooobraznyh.
класовете обекти се зареждат от приставки, които декларираните класове. При зареждането на дадена приставка (пакет) Регистрирайте клас (RegisterClass). Приставката натоварен правила за справяне с такива обекти.
Самите обекти са заредени от базата данни, която съхранява името на класа.
С FindClass получи препратка към класа и да се създаде клас обект, който не е известен предварително.
Plugins са на разположение в трета страна на разработчиците, така че да използват в зрителя, ако 200-а (за всеки клас няма да работят).
Ясно е, че дизайнерите от всички класове могат да бъдат изпълнени по различен начин.

Памет: 0.82 MB
Време: 0.065 гр