designer de virtuale

Buna ziua
Explicați novice, plz, care este un constructor virtual și cum să-l folosească

Acesta este un ciocan virtual, pasatizhi virtuale etc.


> Explicați începător

începător nu ar trebui să înceapă cu bombardarea forului.

constructorul nu poate fi virtuale.
Ea nu are nici un sens.

> KSergey
greșit.
TComponent.Create


> Nu are nici un sens

O să știu. Și apoi orice utilizare și de a folosi.

Un exemplu de utilitatea designeri virtuale (poate singura - cel puțin, am înțeles sensul că, în acest caz) - este de a le utiliza în combinație cu metaclasses.

De exemplu,
var
MetaClass: tClass;
Obj: tObject;
începe
MetaClass: =. O clasă cu un virtuale Creare, de exemplu, a trecut ca parametru.
Obj: = MetaClass.Create;
Acum putem rezolva în timpul rulării, este creat un obiect de clasă, iar acest lucru va fi numit proiectantul dreapta.

Creare Constructor; virtuale;
Utilizatorii nu au nevoie de ele, și această oportunitate.
De obicei constructorii virtuale sunt folosite împreună cu clasa definiția;

Aceasta este, de a crea un fel de o familie de clase.
TMyBase = class
.
constructor Creare; virtuale;
se încheie;

TMyBaseClass = clasa de TMyBase;

TMyCoolClass1 = class (TMyBase)
.
constructor Creare; suprascrie;
se încheie;

TMyCoolClass2 = clasă (TMyBase);
.
constructor Creare; suprascrie;
se încheie;

TMyVeryCoolClass1 = clasă (TMyCoolClass1);
.
constructor Creare; suprascrie;
se încheie;

Funcția CreateClass (var AObject: TMyBase; ACLASS: TMyBaseClass);
începe
AObject: = AClass.Create;
se încheie;
Acesta va fi numit exact constructorul virtual care este specificat pe link-ul de clasă ACLASS.

Nu știu cum, un novice, așa cum ai spus, sunt conștienți de flexibilitatea oferită, dar dintr-o dată îți dai seama. Puteți citi sursa TCollection, dacă veți înțelege.

Cel mai simplu exemplu se bazează pe cele de mai sus menționat.
Să presupunem că forma va avea trei butoane.
Button_CoolClass1
Button_CoolClass2
Button_VeryCoolClass1
obiectele claselor vor fi create în care OnClick. În loc de a scrie trei evenimente OnClick diferite, puteți scrie doar unul.

tip
TForm1 = class (TForm)
.
Procedură FormCreate (Expeditor: TObject);
privat
Procedură SomeButtonClick (Expeditor: TObject);
MyObject: TMyBase;
se încheie;

Procedură TForm1.FormCreate (Expeditor: TObject);
începe
încerca
TButton (FindComponent ( "Button_CoolClass1")) Tag: = Integer (TMyCoolClass1) ;.
TButton (FindComponent ( "Button_CoolClass2")) Tag: = Integer (TMyCoolClass2) ;.
TButton (FindComponent ( "Button_VeryCoolClass1")) Tag: = Integer (TMyVeryCo olClass1) ;.
cu excepția
se încheie;
se încheie;

În opinia mea, nimic nu este uitat.
Și acum, dacă dintr-o dată, avem în familie va avea o altă clasă, atunci punerea sa în aplicare va fi foarte simplu.

Deci, bine.
Și modul în care acestea pot beneficia de pe urma, mă întreb? Atunci când un obiect este creat în mod diferit, clasa pe care obiectul pe care doriți să găti. Deci cum virtualitate poate folosi? Me în cap nu se urca potrivit.


> Constructor obiect nu poate fi virtuale.
> Nu are nici un sens.

Poate că oamenii spun
constructor TObjectName.Sreate; virtuale;
Apoi, este foarte are sens

Da, am uitat să atribui un handler:

Procedură TForm1.FormCreate (Expeditor: TObject);
începe
încerca
Cu TButton (FindComponent ( "Button_CoolClass1")) do
începe
Tag: = Integer (TMyCoolClass1);
OnClick: = @ SomeButtonClick;
se încheie;
Cu TButton (FindComponent ( "Button_CoolClass2")) do
începe
Tag: = Integer (TMyCoolClass2);
OnClick: = @ SomeButtonClick;
se încheie;
Cu TButton (FindComponent ( "Button_VeryCoolClass1")) do
începe
Tag: = Integer (TMyVeryCoolClass1);
OnClick: = @ SomeButtonClick;
se încheie;
cu excepția
se încheie;
se încheie;

+ spatii offline, dvizhek navstavlyal :)

Doar în cazul în care:

> KSergey
Pe lângă deja menționate, am nota Application.CreateForm.
Și întregul sistem de filetare Delphi se bazează pe utilizarea Wirth. Konstr. (Cm. De Zi, de exemplu)

Ei au stârnit ceva. virtuală și dinamică este o modalitate de a plasa un pointer la o metodă în memorie.
Dacă metoda este descrisă ca virual, atunci este posibil să se blocheze o supraîncărcare th descendent.

Este necesar să se citească încă cartea.
Dar, totuși, eu nu înțeleg de ce virtuale. Atunci când un obiect este, de fapt creat - știm deja exact ce clasa este. Kakashi diferență: codul este un registru sau o trecere variabilă prin clasa? La naiba cu asta, este cunoscut! Cum aici virtualitate ceva folosit?

> Și cum este posibil să se folosească, mă întreb? Atunci când un obiect este creat în mod diferit, clasa

Iată un exemplu real - de la sursa CPF compilator.
Acolo tDLLScanner - clasa constructor virtuale Crearea, CDLLScanner - matrice (elemente corespund în platforme suportate) tip de element TDLLScannerClass = clasă de TDLLScanner.


dacă (cs_create_smart în aktmoduleswitches) atunci
începe

dacă este atribuit (importssection) și
(Target_info.system în [system_i386_win32, system_i386_wdosx]), atunci
începe
importsSection.clear;
importlib.generatesmartlib;
se încheie;

GenerateAsm (true);
în cazul în care target_asm.needar atunci
Linker.MakeStaticLibrary;
se încheie;

În general, toate utilitatea designeri virtuale pot realiza numai dacă peresyadesh C ++ ;-)


> În general, toate utilitatea designeri virtuale pot realiza
> Numai dacă peresyadesh C ++ ;-)

Ce sunt ei interesați de Delphi mai rău?

Faptul că acestea sunt în Delphi, a pus în C ++ și nu le-au ;-))


>
>> În general, toate utilitatea designeri virtuale pot
> Să recunoască
>> Numai dacă peresyadesh C ++ ;-)
>
> Ce sunt mai rău în Delphi interesant?

Mirosul vine războiul sfânt.

PS
justificarea că, să-l puneți blând, așezat într-o baltă, eventual, ar putea fi doar faptul că detaliile cu privire la toate aceste virtualizare citesc doar în cărți despre C ++, Delphi, și într-un fel de către el însuși funcționează bine;)

> Dinamic și virtual este o modalitate de a plasa un pointer la o metodă în memorie.

Cu toate acestea, mai degrabă indicii pentru metodele ancestrale.

> Dacă metoda este descrisă ca virual, apoi copilul poate fi tăiat
> Mii de suprasarcină.

1. „Override“ - această modificare și suprasarcină - este destul de altul.
2. Metodele dinamice se suprapun în același mod ca și virtual. Diferența dintre ele nu este punctul.

Mmm, doar pentru claritate, poate fi util


> 1. „Override“ - această modificare și suprasarcină - este destul de altul.
> 2. Metodele dinamice se suprapun în același mod ca și
> Virtual. Diferența dintre ele nu este punctul.

Greșeală în scris un simplu :)

Apoi incorecte. Pentru că dacă metoda este descrisă ca dinamică, apoi descendent al lui, de asemenea, pot fi acoperite de aceeași suprascriere „OM.

Știu toate astea de la al doilea an, fără ezitare a scris, îmi pare rău;)

Desigur, este greu posibil să se utilizeze în practică, dar pentru înțelegerea anumitor lucruri IMHO utile.

În sine într-un fel alege deschis.
Au fost formate de tabele
-48 DynamicTable
-52 MethodTable
-56 FieldTable
-60 TypeInfo
-64 InitTable
-68 AutoTable
-72 IntfTable

Dar, la naiba, eu nu pot găsi. Am pregătit chiar și un articol numit „DELPHI în interior.“
Da, am aruncat-o dată a fost.


> system.pas

Da, și că este în cazul în care trebuie să ne uităm :)

> Și există unele informații cu privire la acest subiect?
> Și unde să-l?

Orice carte, care descrie Object Pascal.

> Orice carte, care descrie Object Pascal.
Ei bine, eu doar orice;)

În Lishnere au astfel de informații.


> Ei bine, eu doar orice;)

Nu știu, tot ce am citit, prin urmare, nu a fost corectă interpolare.

(Am înțeles că toate astea știu, dar lasă-mă să împărtășesc bucuria mea)

Am vrut doar să pun o întrebare cum ar fi:

2. Numai să fiu sincer, eu nu văd în cazul în care acest lucru poate fi indispensabil. Nu este clar despre crearea unui obiect al clasei, care este înregistrată într-o variabilă. Cu toate acestea, în funcție de cât de multe pe scena de proiectare a cererii, știu ce sunt posibile (nu-mi pot imagina o situație în care nu știu toate opțiunile, care este, da, pot exista condiții, dar, de asemenea, în mod clar și prescrie toate opțiunile posibile pentru crearea într-un fel sau o altă clasă), și, prin urmare, - poate că este doar clopotele și fluierele frumos, dar nu mai mult? În sensul că el a înlocui complet proiectarea de forma:

caz I
1: MyObj: = TObj1.Create;
2: MyObj: = TObj2.Create;
3: MyObj: = TObj3.Create;
se încheie;

Da, scrie-l ca orice poate fi, dar iti place un cod compact și ușor extensibil frumos? Apoi, amintiți-vă axioma că unele sarcini, cum ar fi „sistem de filetare Delphi“, trebuie să fie făcut cu constructori virtuale.


> Cu toate acestea, în funcție de cât de multe pe aplicațiile etapa de proiectare
> Știu ce sunt posibile toate opțiunile (nu-mi pot imagina
> O astfel de situație. Nu știu; și anume Da, poate fi
> Condiții, dar am, de asemenea, în mod clar și prescrie toate opțiunile posibile
> Pentru a crea un fel sau o altă clasă

Avem un vizualizator de simplu obiecte clase raznooobraznyh.
clase de obiecte sunt încărcate de plugin-uri, care au declarat clase. Când încărcați un plugin (pachet) Register Clasa (RegisterClass). Plugin-ul încărcat, de asemenea, reguli pentru a face cu astfel de obiecte.
ele însele Obiectele sunt încărcate din baza de date care stochează numele clasei.
Cu FindClass obține o referință la clasa și de a crea un obiect de clasă, care nu este cunoscut în prealabil.
Plugin-uri sunt disponibile în dezvoltatori terți, deci utilizați în vizualizator dacă-200 s (pentru fiecare clasă nu va funcționa).
Este clar că designerii tuturor claselor pot fi puse în aplicare în diferite moduri.

Memorie: 0,82 MB
Timpul: 0,065 c