Newsgroup: it.comp.lang.visual-basic
Titolo: Ereditarietà in Visual Basic 5/6

Ciao a tutti,
Non scrivo un articolo per il sito comune perchè non so se questo possa
essere di interesse e perchè non ho tempo.
Lo sottopongo a voi e poi vedremo. :)
In questi giorni mi sono chiesto "possibile che in VB6 davvero non sia
possibile sfruttare l'ereditarietà?".
Alla fine la risposta è "No", però entro alcuni limiti è possibile simularla
sfruttando quel poco che VB offre
per l'implementazione delle interfacce e un pizzico di incapsulamento.
Il pattern è piuttosto semplice:
----------- Classe Base -------------
Metodo Pubblico con implementazione di base
-------- Fine Classe Base -----------
--------- Classe Derivata -----------
Implements ClassBase
Dim b As ClassBase
Private Sub Class_Initialize()
    Set b = New ClassBase
End Sub
Private Sub ClassBase_Metodo()
 ' Implementazione
End Sub
Public Sub Metodo()
    Call ClassBase_Metodo
End Sub
Metodi pubblici aggiuntivi della classe derivata
------- Fine Classe Derivata --------
Purtroppo con questo sistema è possibile realizzare un'ereditarietà di un
solo livello utile,
cioè C può "ereditare" da B che a sua volta può "ereditare" da A, ma la
gerarchia delle superclassi
può essere riconosciuta solo fino al livello superiore.
In altre parole, C può essere riconosciuta come TypeOf B, e B come TypeOf A,
ma C non può essere
riconosciuto come TypeOf A :(
Esempio, mettiamo di avere queste tre classi
Animale  (Classe Base)
Mammifero  (Classe Derivata, Implementa Animale)
Cane   (Sub Classe Derivata, Implementa Mammifero)
Se io ho una sub generica
Function GetName(ByVal a As Animale) As String
Posso fare
Dim m As Mammifero
...
Debug.Print GetName(m)
Ma non posso fare
Dim c As Cane
...
Debug.Print GetName(c)
Poichè cane non implementa Animale e quindi non è riconosciuta come tale.
Lo so, non è il massimo, ma è già qualcosa verso una programmazioni più
flessibile e OO.
E per finire un esempio pratico:
----------- ClassBase.cls -------------
Option Explicit
Public Sub DoSomething()
    Debug.Print "Class Base Did Somenting"
End Sub
-------- Fine ClassBase.cls -----------
--------- ClassDerivedA.cls -----------
Option Explicit
Implements ClassBase
Dim b As ClassBase
Dim whatToDo_ As String
Private Sub Class_Initialize()
    Set b = New ClassBase
    WhatToDo = ""
End Sub
Private Sub ClassBase_DoSomething()
    Debug.Print "Class Derived A Did " & whatToDo_
End Sub
Public Sub DoSomething()
    Call ClassBase_DoSomething
End Sub
Public Property Let WhatToDo(ByVal value As String)
    If whatToDo_ = "" Then
        whatToDo_ = "Nothing"
    Else
        whatToDo_ = value
    End If
End Property
------ Fine ClassDerivedA.cls----------
--------- ClassDerivedB.cls -----------
Option Explicit
Implements ClassBase
Dim b As ClassBase
Dim times_ As Long
Private Sub Class_Initialize()
    Set b = New ClassBase
    Times = 1
End Sub
Private Sub ClassBase_DoSomething()
    Debug.Print "Class Derived B Did Something " & times_ & " Times"
End Sub
Public Sub DoSomething()
    Call ClassBase_DoSomething
End Sub
Public Property Let Times(ByVal value As Long)
    times_ = value
End Property
------ Fine ClassDerivedB.cls----------
------------- Form1.cls ---------------
Option Explicit
' Add a command button to the form!
Private Sub Command1_Click()
    Dim cb As New ClassBase
    Dim cda As New ClassDerivedA
    Dim cdb As New ClassDerivedB
    Call MakeClassDoSomething(cb)
    ' Derived Class A have a string property too
    cda.WhatToDo = "A Cake"
    Call MakeClassDoSomething(cda)
    ' Derived Class B have a long property too
    cdb.Times = 2
    Call MakeClassDoSomething(cdb)
End Sub
Public Sub MakeClassDoSomething(ByVal c As ClassBase)
    c.DoSomething
End Sub
---------- Fine Form1.cls -------------
Ciao
--
Reporting tool: 
http://www.neodatatype.net
Qualunque mentecatto può scrivere codice che un computer possa capire.
I buoni programmatori scrivono codice che gli uomini possano capire.
[Martin Fowler]

 End Sub
Lo so, sono uno sporco pignolo, ma siccome non mi fido mai
dei default e non  ho voglia di ricordarmi tutti i default
degli ambienti/linguaggi che uso, ti chiedo:
quel Dim e` inteso come Private, vero?
-- 
ciao, hal

 quel Dim e` inteso come Private, vero?
Sě, infatti questa č stata una mia leggerezza :)
Di solito Dim lo uso solo all'interno dei metodi, ma qui la pigrizia ha
avuto il sopravvento :P
Ciao
--
Reporting tool: 
http://www.neodatatype.net
Qualunque mentecatto puň scrivere codice che un computer possa capire.


Tutto molto bello, MA:
http://groups-beta.google.com/group/it.comp.lang.visual-basic/browse_thread/thread/2cb926ddd9d0ecd0/4b4aa074e22a0236?q=Raimondi+VB+ereditariet%C3%A0#4b4aa074e22a0236
Solitamente ri-linko vecchi post miei solo quando non mi và di
ri-scrivere le stesse identiche cose daccapo. Tuttavia stavolta devo
farlo "tanto per la precisione".
Ciao,
Andrea
P.S. nessun "astio" nè implicito nè esplicito, esclusivamente tanto
perché resti memoria.

 perché resti memoria.
Sì, ma io l'ho scritto meglio :P


 Ciao
Andrea