Page 1 of 2 12 LastLast
Results 1 to 15 of 17

Thread: [VB.NET/C#] Override

  1. #1
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default [VB.NET/C#] Override

    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!
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  2. #2
    Warrant Officer
    Join Date
    Nov 2003
    Location
    Suisse
    Posts
    2.969

    Default

    posteresti mica la firma del metodo (il codice proprio) ? Vediamo se riesco a darti na mano
    I will be back, eventually.

  3. #3
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    Quote Originally Posted by NoeX View Post
    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:

    Code:
    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:

    Code:
        
    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:

    Code:
    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
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  4. #4
    Warrant Officer
    Join Date
    Nov 2003
    Location
    Suisse
    Posts
    2.969

    Default

    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
    Last edited by NoeX; 14th April 2010 at 21:38.
    I will be back, eventually.

  5. #5
    Warrant Officer
    Join Date
    Nov 2003
    Location
    Suisse
    Posts
    2.969

    Default

    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
    Last edited by NoeX; 14th April 2010 at 21:58.
    I will be back, eventually.

  6. #6
    Lieutenant
    Join Date
    Feb 2004
    Location
    Bresso
    Posts
    4.683

    Default

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

  7. #7
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    Quote Originally Posted by NoeX View Post
    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)

    Quote Originally Posted by Kat View Post
    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.
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  8. #8
    Lieutenant
    Join Date
    Feb 2004
    Location
    Bresso
    Posts
    4.683

    Default

    Ah, shadows non c'e' in c#, non sapevo a cosa servisse.

  9. #9
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    Quote Originally Posted by Kat View Post
    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
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  10. #10
    Warrant Officer
    Join Date
    Nov 2003
    Location
    Suisse
    Posts
    2.969

    Default

    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
    Last edited by NoeX; 14th April 2010 at 23:10.
    I will be back, eventually.

  11. #11
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    Quote Originally Posted by NoeX View Post
    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?
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  12. #12
    Warrant Officer
    Join Date
    Nov 2003
    Location
    Suisse
    Posts
    2.969

    Default

    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())
    I will be back, eventually.

  13. #13
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    Quote Originally Posted by NoeX View Post
    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 :/
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  14. #14
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    Confermo che usando overrides al posto di shadows il tutto funziona -.- che palle però! Grazie neox per l'interesse
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  15. #15
    Warrant Officer
    Join Date
    Nov 2003
    Location
    Suisse
    Posts
    2.969

    Default

    Quote Originally Posted by Eltarion View Post
    Confermo che usando overrides al posto di shadows il tutto funziona -.- che palle però! Grazie neox per l'interesse
    Noex

    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
    I will be back, eventually.

Page 1 of 2 12 LastLast

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
[Output: 109.54 Kb. compressed to 93.24 Kb. by saving 16.30 Kb. (14.88%)]