CARATTERISTICHE DI BASE:
* Architettura pienamente orientata agli oggetti . Le funzioni per la creazione delle classi sono un vero oggetto Clipper (classe _OBJECT_).
* Assegnamenti dei Code Blocks a IVars e Metodi per un codice più veloce e pulito
* Assegnamenti degli Inline Code a IVars parimenti per un codice più veloce e pulito
* Completa ereditarietà degli INLINE/BLOCKS Methods ed IVars.
* 100% supporto del Debugger per chi usa STATICS Methods.
* Permette alle IVars di assumere valori di default a momento della creazione della classe. Meno codice da scrivere per il costruttore della funzione.
* Permette di inserire al volo nuove IVars e campi del database col runtime utilizzando :: InsData ()
* Supporta eredità Multipla, Incapsulazione e Polmorfismo.
* Supporta il Dizionario della Classe (self:dict) come un oggetto.
* Implementa :: super
* Supporta la classe ALIAS per un facile accesso ai parent methods come pure al metodo interno ::super (CLASSNAME): cMsg (per compatibilità con oClip e oOClip)
* Supporta i VIRTUAL Methods
* Supporta i LINKED Methods
* Supporta GETSET data functions definite dall'utente.
* Supporta l'opzione EXCLUDE al fine di rimuovere metodi non desiderati ed IVars dalle classi ereditate
* Supporta metodo di ispezione della classe o:classInfo () per ogni classe.
* Supporta variabili LOCAL e VIRTUAL
* Compatibilità piena con le librerie di classire oClip e oOClip, qualche compatibilità con Class(y) ed Objects 1.00- 4.00
* Esempi dei programmi migliorati e vere classi mondiali.
* Supporta STATIC Methods e Reusable Method UDFs.
* Supporta la piene ereditarietà delle classi native di Clipper e altre
classi che utilizzano il sistema di Clipper per la creazione della classe.
* Supporta on line il subclassing delle object instance variables.
VEDUTA D'INSIEME:
OGGETTI E OOBJECT:
--------------------------
Per scrivere nuove classi con oObject (chiamte anche UDOs, User Defined Objects), dovete seguire alcuni indirizzi. Questi indirizzi sono al 99% comuni
alla maggior parte delle librerie di classi (come Class(y), TopClass, Objects, ecc.) così voi non dovete realmente modificare il modo in cui scrivete le Vostre classi. Infatti, la sintassi di object ed il set di comandi sono molto simili a quelli della maggior parte delle biblioteche di classi, cosicché nella maggior parte dei casi non dovrete cambiare una singola linea di codice.
a) Dichiarazione della Classe
1) Crea la classe e definisce la sua classe Super se esiste. Ogni classe deve dichiarare uno PSEUDONIMO unico che useremo quando chiameremo un super method che condivide lo stesso nome con quello della nostra classe:
CLASS Box ALIAS Box // Super class
<code...>
ENDCLASS
CLASS Window FROM Box ALIAS oW
or
CREATE CLASS Window INHERIT Box ALIAS oW // Child class
<code...>
ENDCLASS
In questo modo, il metodo BOX::display() diventerà ::BoxDisplay() nella
classe WINDOW se la classe WINDOW ha anche un ::display() method
altrimenti, ::display() sarà passato alla classe WINDOW così com'è.
2) Dichiarazione delle Istance Variables (variabili istanza) ed assegnarle valori di default
I) IVars Semplici
DATA nTop, nLeft, nBottom, nRight AS INT
II) INLINE IVars- Data & Code combinati
DATA Recno( n ) INLINE ;
IF( n == NIL, (::Alias)->(Recno()),;
(::Alias)->(dbGoto(n))
III) Speciali GET/SET IVars
IV) LINKed IVars
3) Dichiarazione dei Metodi della classe.
I) Metodi PUBBLICI (Public Methods)
// Questi puntano ad una PUBLIC function _WinDisplay()
METHOD Display = _WinDisplay MESSAGE Display METHOD _WinDisplay
II) Metodi STATICI (Static Methods) - notare i parametri
METHOD Display( lRefresh )
METHOD Move( nRows, nCols )
III) INLINE Methods
METHOD Dispgets() INLINE ;
Aeval( ::GetList, {|e| e:Display() })
4) Inserisce la nuova classe utilizzando il comando ENDCLASS.
b) Definisce uno o più Metodi del costruttore. Metodi del costruttore possono essere PUBBLIC o STATIC in relazione al modo in cui sono stati definiti durante la dichiarazione della classe (vedi sopra). Devono inizializzare la classe per far accettare alcuni parametri da assegnare alle IVars.
La maggior parte delle volte il metodo costruttore si chiama New() o INIT() e deve restituire Self come pure quesi metodi che non restituisco nulla. Nella funzione costruttore dovremo inserire anche il metodo costruttore della Super Class se c'è.
//METHOD New( nTop, nLeft, nBottom, nRight) // STATIC Method
METHOD FUNCTION _WinNew( nTop, nLeft, nBottom, nRight) // PUBLIC Method
DEFAULT nTop := 0
DEFAULT nLeft := 0
DEFAULT nBottom := 0
DEFAULT nRight := 0
::nTop := nTop
::nLeft := nLeft
::nBottom := nBottom
::nRight := nRight
::Super:New( ::nTop, ::nLeft, ::nBottom, ::nRight )
// or ::BoxNew(::nTop, ::nLeft, ::nBottom, ::nRight)
RETURN self
c) Definisce i metodi della nuova classe. I metodi possono essere PUBLIC o STATIC in relazione al modo in cui sono stati definiti durante la dichiarazione della classe (vedi sopra). Se il metodo non ritorna nulla com, come ad esempio calcolo di dati, è assolutamente necessario che ritorni self.
Questo permette il concatenamento dei metodi:
oTbrowse:ForceStable():RefreshAll():RefreshCurrent()
METHOD Display( lRefresh ) //STATIC Function
METHOD FUNCTION _WinDisplay( lRefresh ) //PUBLIC Function
<code...>
<code...>
<code...>
RETURN self
d) Per richiamare l'oggetto WINDOW dal vostro codice:
LOCAL o := Window():New( 10,10,20,30):Display()
Oppure ...
LOCAL o := Window()
o:New( 10,10,20,30)
o:Display()