Newsgroup: it.comp.lang.visual-basic
Titolo: ereditarietà[vb2005]

Ciao a tutti, necessito di un oggetto che possa "puntare" a oggetti
diversi come label e picturebox.
Public Class Form1
    Friend WithEvents temp As New Windows.Forms.Control
    'Friend WithEvents temp As tempo
    ...
Case "Image"
                Dim buton1 As New Picturebox
                ...
                AddHandler buton1.MouseHover, AddressOf
complex_MouseHover
                temp = buton1
Case "Image"
                Dim buton1 As New Label
                ...
                AddHandler buton1.MouseHover, AddressOf
complex_MouseHover
                temp = buton1
Questo funziona.
Vorrei aggiungere una proprietà a temp, quindi creo la seguente
classe:
Public Class tempo
    Inherits Windows.Forms.Control
    Private _border
    Public Property BorderStyle() As System.Windows.Forms.BorderStyle
        Get
            Return _border
        End Get
        Set(ByVal value As BorderStyle)
            _border = value
        End Set
    End Property
End Class
Ora nella classe Form1, faccio ereditare temp dalla classe tempo ma
ottengo i seguenti errori:
-impossibile convertire il valore di tipo "Windows.system.label" in
"prova_editor.tempo"
impossibile convertire il valore di tipo "Windows.system.picture" in
"prova_editor.tempo"
Non capisco il motivo, qualcuno mi aiuta?
Grazie

 Non capisco il motivo, qualcuno mi aiuta?
Semplicemente perchè label e picture derivano da Control e non da tempo.
Ciao 

 Ciao
Ciao e grazie per l'aiuto che mi stai dando, come vedi ho le idee un
pò confuse :)

 quindi fare un cast di label e picture e portarli al tipo tempo?
Non puoi.
Temp eredita da Control, Label eredita da Control, PictureBox eredita da 
Control.
I tre solo allo stesso livello.
Puoi fare un cast da Control a uno dei tre (se il tipo referenziato è 
corretto) ma non passare da un'oggetto all'altro dello stesso livello: è 
come se tentassi di fare un cast da label a picturebox.
Ciao 

 come se tentassi di fare un cast da label a picturebox.
Perchè se scrivo:
Public Class Form1
    Friend WithEvents temp As New Windows.Forms.Control
non viene dato nessun errore su temp=buton1? In questo caso anche temp
non si trova allo stesso livello di label e picturebox?
Ti spiego semplicemente il problema: vorrei che quando il cursore si
spostasse sull'oggetto temp( che può essere sia label che picturebox),
sia visualizzato il bordo....ma temp non ha la proprietà border...mi
sto complicando la vita?
Ciao

 sto complicando la vita?
mmm... sì.
Bastava che tu ti facessi un controllo MyLabel che eredita da Label e sul 
MouseEnter/MouseExit setti un flag che indica se sei dentro o fuori, chiami 
un'Invalidate() e nella OnPaint a seconda del flag disegni o no il bordo.
Compili e trascini sul form il tuo nuovo controllo.
Lo stesso per la PictureBox.
Ciao

>         Me.SplitContainer1.Panel1.Controls.Add(control) ' ma questo compila?
Fabio, appena posso cerco di capire il tuo codice e modificare il
mio...anche se un pò "casareccio" il mio codice funziona :)
compilazione ok.
Ciao

 compilazione ok.
Il mio codice l'ho scritto *prima* di aver letto la tua domanda finale.
Non credo che sia la strada giusta per fare quello che ti serve.
Ciao 

Lo stesso per la PictureBox.
Ho provato ma mi dai dei problemi...per adesso la lascio senza bordi
poi vedremo.
Se vuoi dare uno sguardo al codice per avere una panoramica generale
fammelo sapere che te lo posto.
Ciao

 proprietā aggiuntive?
Erediti da Control e ci aggiungi le proprietā.
Ma tu non vuoi un nuovo Control con proprietā in pių: tu vuoi una *Label* 
con properietā in pių.
Hai due strade a seconda di cosa vuoi ottenere alla fine:
1) Ereditarietā: erediti da Label e ci aggiungi le proprietā che ti 
interessa.
In questo caso lo sbattimento č che per ogni controllo personalizzato devi 
ridefinirti la proprietā.
2) Incapsulamento: erediti un MyControl di base da Control, ci aggiungi le 
proprietā che ti interessa.
Erediti una MyLabel da MyControl e ci appiccichi sopra la Label.
Qui hai il vantaggio che tutti i tuoi componenti hanno come base dei 
"MyControl" e quindi tutte le proprietā sono definite una volta sola.
Perō perdi tutti i vantaggi dell'ereditarietā, cioč devi ridefinire tutte le 
proprietā che ti interessano specifiche di Label (non quelle di Control che 
vengono ereditate automaticamente.
Io sceglierei la prima, magari con l'implementazione di un'interfaccia per 
mantenere un'interfaccia comune tra tutti i tuoi componenti (ad es. una 
IAlcibiadeControl) dove definisci le proprietā che i tuoi controlli devono 
implementare.
Ciao 

 Erediti una MyLabel da MyControl e ci appiccichi sopra la Label.
Forse questa soluzione l'avevo adottata all'inizio: avevo creato un
user control contenente sia la label che il picturebox.In base
all'oggetto che mi serviva settavo ad invisibile l'altro.
Ti ringrazio per tutti i consigli, ora vedo come muovermi.