Log in

View Full Version : [VB.NET/C#] Override



Eltarion
14th April 2010, 14:13
Allora ho un problema con vb.net e il polimorfismo. Spiego in breve:

ho una classe "stampante" e una sottoclasse "stampanteSeriale". La classe stampante ha un metodo "inviaComando" che invia il messaggio desiderato alla stampante tramite socket. Questo metodo è dichiarato come Protected Overridable. Sempre all'interno delal classe stampante ho altri metodi che utlizzano inviaComando per svolgere la loro funzione (es. il metodo controllaStato invia un particolare comando tramite il metodo inviaComando e mi ritorna poi il risultato).

Nella sottoclasse stampanteSeriale ho un metodo inviaComando che fa l'override dell'inviaComando della superclasse. Il metodo è dichiarato come Protected Shadows (utilizzo shadows perchè in questo caso il metodo mi restituirà un tipo di dato differente rispetto al metodo della superclasse). Ovviamente faccio questo override perchè l'oggetto stampanteSeriale dovrà comunicare attraverso la porta seriale e non tramite socket (come invece fa il padre)

Ora quando io creo un oggetto di classe stampanteSeriale e richiamo il metodo controllaStato (metodo ovviamente ereditato dalla superclasse) sto maledetto mi va ad usare il metodo inviaComando della superclasse, anzichè quello shadow della classe stampanteSeriale!

Come cazzo si permette di farmi questo affronto??? Dove sto sbagliando??

Una probabile soluzione sarebbe fare l'override anche dei metodi che utlizzano inviaComando, ma sarebbe stupido perchè tanto varrebbe non ereditare nulla :/

HELP PLEASE!

NoeX
14th April 2010, 15:30
posteresti mica la firma del metodo (il codice proprio) ? Vediamo se riesco a darti na mano

Eltarion
14th April 2010, 15:35
posteresti mica la firma del metodo (il codice proprio) ? Vediamo se riesco a darti na mano

ok allora questo è il metodo inviaComando della superclasse stampante:


Protected Overridable Function inviaComando(ByVal comando As String, ByVal richiediRisposta As Boolean, _
ByVal ParamArray dati() As String) As Byte()
'la funzione stabilirà una connessione con l'applicatore e attenderà la risposta (fine ciclo o errore)
'bisogna impostare le stampanti per rispondere sempre dopo la stampa di un'etichetta
'aggiungere ciclo attesa risposta
Dim pcSocket As New System.Net.Sockets.TcpClient()
Dim applicatoreStream As NetworkStream
Dim messaggioOut As String = ""
Dim outStream As Byte()
Dim risposta As String = ""

pcSocket.Connect(Me.ip, Me.portaOut)

applicatoreStream = pcSocket.GetStream()

If dati.Count > 0 Then
For i As Integer = 0 To dati.Count - 1
messaggioOut = comando & dati.ElementAt(i) & Microsoft.VisualBasic.ControlChars.CrLf
outStream = System.Text.Encoding.ASCII.GetBytes(messaggioOut)
applicatoreStream.Write(outStream, 0, outStream.Length)
applicatoreStream.Flush()
Next
Else
messaggioOut = comando & Microsoft.VisualBasic.ControlChars.CrLf
outStream = System.Text.Encoding.ASCII.GetBytes(messaggioOut)
applicatoreStream.Write(outStream, 0, outStream.Length)
applicatoreStream.Flush()
End If

Dim inStream(pcSocket.ReceiveBufferSize) As Byte

If richiediRisposta = True Then
applicatoreStream.ReadTimeout = 3000
Try
applicatoreStream.Read(inStream, 0, CInt(pcSocket.ReceiveBufferSize))
applicatoreStream.Flush()
Catch ex As Exception
inStream = System.Text.Encoding.ASCII.GetBytes("null")
End Try
pcSocket.Close()
Return inStream
Else
inStream = System.Text.Encoding.ASCII.GetBytes("null")
pcSocket.Close()
Return inStream
End If

End Function

questo è un metodo della superclasse stampante che utilizza il metodo inviaComando:



Public Sub impostaRitornoStampa(ByVal attiva As Boolean)
If attiva = True Then
inviaComando("?50&2,1", False)
Else
inviaComando("?50&2,0", False)
End If
End Sub

questo invece è il metodo della sottoclasse stampanteSeriale che fa l'override (in questo caso tramite shadow perchè come dicevo prima ritorna un tipo di dato differente) del metodo inviaComando della superclasse stampante:


Protected Shadows Function inviaComando(ByVal comando As String, ByVal richiediRisposta As Boolean, _
ByVal ParamArray dati() As String) As String
Dim messaggioOut As String
Me.porta.Open()

If dati.Count > 0 Then
For i As Integer = 0 To dati.Count - 1
messaggioOut = comando & dati.ElementAt(i) & Microsoft.VisualBasic.ControlChars.CrLf
Me.porta.Write(messaggioOut)
Me.porta.DiscardOutBuffer()
Next
Else
messaggioOut = comando & Microsoft.VisualBasic.ControlChars.CrLf
Me.porta.Write(messaggioOut)
Me.porta.DiscardOutBuffer()
End If

If richiediRisposta = True Then
Dim risposta As String
Me.porta.ReadTimeout = 3000
Try
risposta = Me.porta.ReadExisting
Me.porta.Close()
Return risposta
Catch ex As Exception
Me.porta.Close()
Return "null"
End Try
Else
Me.porta.Close()
Return "null"
End If
End Function

NoeX
14th April 2010, 19:43
arrivato a casa adesso... ci dò un'ccohio ora prima che ceno, vediamo

------- Metodo Superclasse
Protected Overridable Function inviaComando(ByVal comando As String, ByVal richiediRisposta As Boolean, _
ByVal ParamArray dati() As String) As Byte()
...
End Function

------- Metodo Subclass

Protected Shadows Function inviaComando(ByVal comando As String, ByVal richiediRisposta As Boolean, _
ByVal ParamArray dati() As String) As String
...
End Function

NoeX
14th April 2010, 21:39
Scusa mi faresti vedere come istanzi l'oggetto stampanteseriale ?
immagino dim a as stampanteseriale()
cmq è un problema di binding, a runtime prende il metodo della superclass, fammi vedere come lavora vb .net

Kat
14th April 2010, 22:03
vb non lo mastico (e manco lo digerisco), ma non hanno 2 tipi di ritorno diversi le due funzioni?

Eltarion
14th April 2010, 22:15
Scusa mi faresti vedere come istanzi l'oggetto stampanteseriale ?
immagino dim a as stampanteseriale()
cmq è un problema di binding, a runtime prende il metodo della superclass, fammi vedere come lavora vb .net

Azz purtroppo non ho il codice dietro, ma l'oggeto lo instanzio come dici tu, però lo inserisco in una list di oggetti stampante (ma per il polimorfismo questo dovrebbe essere concesso)


vb non lo mastico (e manco lo digerisco), ma non hanno 2 tipi di ritorno diversi le due funzioni?

Si, infatti nella sottoclasse ho dovuto usare shadows anzichè overrides, ma dovrebbe essere una cosa lecita (shadows è stato pensato proprio per questo).


Per completezza riassumo come istanzio questi oggetti: leggo un file in cui sono contenute le info delle stampanti e a seconda del tipo (un flag) le istanzio come stampanti o come stampanti seriale e butto tutti questi oggetti in una list.

Kat
14th April 2010, 22:44
Ah, shadows non c'e' in c#, non sapevo a cosa servisse.

Eltarion
14th April 2010, 22:50
Ah, shadows non c'e' in c#, non sapevo a cosa servisse.

azz non lo sapevo, ho cercato su internet e in effetti non c'è. però è davvero comodo :hidenod:

NoeX
14th April 2010, 23:07
Comunque... hai provato a mettere overrides invece di shadows, per curiosità ? I metodi avendo firma uguale (il val di ritorno non sò se abbia importanza in vb .net, non credo) non dovrebbe dare errori in questo senso.

Te lo dico perchè quel problema lì secondo me è un problema di binding.
Se il metodo è overridden, il tipo attuale dell'oggetto decide quale metodo usare

Ma se è shadow ?

Domani quando sono in ufficio faccio una prova e ti dico :)

Eltarion
14th April 2010, 23:16
Comunque... hai provato a mettere overrides invece di shadows, per curiosità ? I metodi avendo firma uguale (il val di ritorno non sò se abbia importanza in vb .net, non credo) non dovrebbe dare errori in questo senso.
Te lo dico perchè quel problema lì secondo me è un problema di binding.
Se il metodo è overridden, il tipo attuale dell'oggetto decide quale metodo usare
Ma se è shadow ?
Domani quando sono in ufficio faccio una prova e ti dico :)

se è shadows dovrebbe fare lo stesso da quanto ho letto, comunque anche io credo sia un problema di binding. Domani provo a mettere overrides, ma voleco evitarlo perchè poi dovrei cambiare la funziona per farle restiruire un vettore di byte (come la superclasse) anzichè una stringa (trasformarla in byte è semplice, ma non mi piace "formalmente", però se è l'unica maniera farò così). Non ho ancora provato perchè credevo che il problema fosse nel richiamare il metodo shadow da un metodo che non è overridable della superclasse (attivaRitornoStampa (superclasse) --> inviaComando (shadows))

Comunque dove sono tutti i sedicenti neolaureti in informatica? vi hanno insegnato solo ad usare office? :sneer: :sneer: :sneer:

NoeX
14th April 2010, 23:26
Nè il valore di ritorno, nè le eccezioni fanno parte della firma del metodo, quindi non devi modificare niente :) Solo ordine e tipo compongono la firma

inviaComando(String, Boolean, String())

Eltarion
15th April 2010, 00:49
Nè il valore di ritorno, nè le eccezioni fanno parte della firma del metodo, quindi non devi modificare niente :) Solo ordine e tipo compongono la firma

inviaComando(String, Boolean, String())

No perchè se uso overrides devo far restituire al metodo lo stesso tipo di dato che restituisce il metodo della superclasse :/

Eltarion
15th April 2010, 10:03
Confermo che usando overrides al posto di shadows il tutto funziona -.- che palle però! Grazie neox per l'interesse :)

NoeX
15th April 2010, 13:19
Confermo che usando overrides al posto di shadows il tutto funziona -.- che palle però! Grazie neox per l'interesse :)

Noex :madd:

Ad ogni modo, allora shadows si comporta in modo diverso da overrides per quanto riguarda il binding dei metodi a runtime ?
Appena stacco per la pausa pranzo, quasi quasi faccio una prova scema da due minuti, è un comportamento del cazzo effettivamente

Eltarion
15th April 2010, 14:01
Noex :madd:
Ad ogni modo, allora shadows si comporta in modo diverso da overrides per quanto riguarda il binding dei metodi a runtime ?
Appena stacco per la pausa pranzo, quasi quasi faccio una prova scema da due minuti, è un comportamento del cazzo effettivamente

Azz scusa, purtroppo ho l'abitudine di scambiare le lettere nelle parole. Di solito me ne accorgo perchè il correttore ortografico si arrabbia :P

Comunque sinceramente non ho capito da cosa fosse dato il problema. A livello teorico shadows doveva funzionare. Comunque meglio così alla fine adattando il metodo e facendo l'override mi è venuta una soluzione più pulita.

Jeff
15th April 2010, 14:54
Se poi fate delle prove, potete postare il risultato, pliz? :love:

Non uso VB .NET, ma solo il C# ma ero curioso di sapere come funzionava shadows...