2015-09-08 7 views
5

Quindi perché non è consentito avere membri SharedMustOverride/Overridable? Alcuni sostengono che l'override sia correlata all'ereditarietà, il che non ha senso nel caso di membri Shared perché non è prevista alcuna istanziazione. Ecco un esempio in cui ne ho bisogno:Dichiarazione di MustOverride condivisa

La mia classe di base DrawingObject definisce un membro Shared nome TypeName che deve essere implementata da ogni classe figlia per restituire una stringa di identificazione univoco, che è diverso per ogni tipo di bambino, ma uguale per tutti istanza di un tipo di bambino. Ora questo mi richiede di avere la proprietà TypeName definita come Shared e Overridable. O c'è un modo migliore per farlo?

Classe base

Public MustInherit Class DrawingObject 
    Public MustOverride ReadOnly Property TypeName As String 
End Class 

classe Bambino

Public Class Rectangle 
    Inherits DrawingObject 

    Public Overrides ReadOnly Property TypeName As String 
    Get 
     Return A_CONST_STRING_DEFINED_IN_THIS_CLASS 
    End Get 
    End Property 
End Class 

Questo codice funziona bene, ma idealmente TypeName avrebbe dovuto essere Shared dal momento che restituisce un Const.

+0

se non ti spiace potresti postare il codice –

+0

@ non-fortunato: ha pubblicato un codice. Plz dai un'occhiata. – dotNET

+0

Rendere una proprietà condivisa e in sola lettura ancora non impone che l'ereditario restituisca un valore * costante *, quindi non sembra ancora risolvere il problema che si desidera. Più probabilmente, sembra che tu abbia bisogno di usare reflection e un attributo, ma non c'è modo di forzare l'erediter ad applicare l'attributo. –

risposta

3

L'intero punto di override è quello di facilitare il polimorfismo. Si passa un oggetto intorno e il modo in cui si comporta dipende dal tipo di oggetto piuttosto che dal tipo di riferimento. Se chiami i membri Shared, li stai chiamando su un tipo piuttosto che su un oggetto, quindi il polimorfismo non si applica in modo da non offrire alcun vantaggio.

Nel tuo caso, se vuoi ottenere il TypeName di un oggetto senza sapere quale tipo è quell'oggetto in fase di esecuzione, ignorare quella proprietà avrebbe senso. Non importa dove ti trovi, puoi ottenere quella proprietà e otterrai il nome del tipo di quell'oggetto. Con un membro condiviso, si otterrà la proprietà su un tipo specifico in modo da poter ottenere semplicemente una proprietà di quel tipo.

richiesto Esempio:

Diciamo che avete un forme che sanno disegnare se stessi sullo schermo. È possibile iniziare con una classe Shape di base con una classe Shape di base con un metodo Draw e quindi ereditare quella classe, ad esempio, nelle classi Square e Circle. Si potrebbe quindi avere un metodo come questo:

Public Sub DrawShape(myShape As Shape) 
    myShape.Draw() 
End Sub 

In questo caso ha senso l'override del metodo Draw nelle classi derivate perché così facendo permette di chiamare semplicemente Draw ovunque ci sia un riferimento Shape e sapere che sarà disegnato correttamente. Se questo metodo viene passato a Square, verrà disegnato un quadrato e se viene passato un numero Circle, verrà disegnato un cerchio, ma il metodo non deve conoscere o preoccuparsi, grazie al polimorfismo.

Se quello che stai suggerendo era possibile, però, e Draw era un metodo Shared, si dovrebbe chiamare Square.Draw ogni volta che si voleva disegnare un quadrato e Circle.Draw ogni volta che si voleva disegnare un cerchio. L'intero punto di sovrascrittura è che si suppone di poter chiamare il metodo su un riferimento del tipo di base e ottenere funzionalità definite nel tipo derivato.Nel tuo scenario, dovresti chiamare il metodo sul tipo derivato per ottenere funzionalità definite nel tipo derivato, quindi non ottieni alcun vantaggio. Non puoi semplicemente chiamare Shape.Draw e fare succedere qualcosa di utile. Oltre a qualsiasi altra cosa, quale classe derivata sceglierebbe?

+0

Ho difficoltà a capire il tuo punto qui. Puoi postare qualche codice di esempio con esso? – dotNET

+0

Esempio fornito. – jmcilhinney

+1

Grazie per la spiegazione, ma stai solo descrivendo il polimorfismo degli oggetti qui. Il mio problema attuale rimane irrisolto. Qual è il modo corretto di forzare le classi derivate per esporre un membro condiviso? Possiamo farlo usando 'MustOverride' per i membri non condivisi, ma non sembra che ci sia un tale modo per i membri condivisi. L'affermazione del problema qui è semplice: se una classe figlio è un 'DrawingObject', ha un' TypeName', che per inciso è comune a tutti gli oggetti classe figlio (quindi 'Shared'). Ora dovrebbe esserci un modo per la classe base di forzarla sui suoi figli. – dotNET