2015-09-08 10 views
5

Warum ist es nicht erlaubt SharedMustOverride/Overridable Mitglieder haben? Einige argumentieren, dass das Überschreiben mit der Vererbung zusammenhängt, was im Fall von Shared Mitgliedern keinen Sinn ergibt, da keine Instanziierung beteiligt ist. Hier ist ein Beispiel, wo ich es:Deklarieren Geteilt Mustoverride

Meine Basisklasse DrawingObject definiert ein Shared Mitglied TypeName genannt, die von jedem Kind Klasse implementiert wurde, muss einen eindeutigen Identifikations-String zurück, die für jedes Kind Typen unterschiedlich ist, aber für alle gleich Instanz eines Kindtyps. Nun ist diese verlangt von mir TypeName Eigenschaft als Shared und Overridable definiert haben. Oder gibt es einen besseren Weg?

Basisklasse

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

Kinder Klasse

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 

Dieser Code funktioniert gut, aber idealerweise sollte TypeNameShared gewesen sein, da es eine Const zurückgibt.

+0

wenn es Ihnen nichts ausmacht können Sie bitte den Code –

+0

@ un-Glück: Posted einige Code. Plz werfen Sie einen Blick. – dotNET

+0

Wenn Sie eine Eigenschaft shared und readonly machen, erzwingt dies immer noch nicht, dass der Vererber den Wert * constant * zurückgibt, so dass das Problem, das Sie beheben möchten, immer noch nicht zu lösen scheint. Wahrscheinlicher ist es, dass Sie Reflektion und ein Attribut verwenden müssen, aber es gibt keine Möglichkeit, den Erben zu zwingen, das Attribut auch anzuwenden. –

Antwort

3

Der ganze Sinn der überwiegenden ist Polymorphismus zu erleichtern. Sie übergeben ein Objekt und die Art und Weise, wie es sich verhält, hängt vom Typ des Objekts und nicht vom Typ der Referenz ab. Wenn Sie Shared Mitglieder anrufen, dann rufen Sie sie auf einen Typ anstatt auf ein Objekt, so dass Polymorphie nicht gilt, so dass das Überschreiben keinen Vorteil bringt.

In Ihrem Fall, wenn Sie die TypeName eines Objekts erhalten möchten, ohne zu wissen, welcher Typ dieses Objekt zur Laufzeit ist, dann würde das Überschreiben dieser Eigenschaft sinnvoll sein. Unabhängig davon, wo Sie sich befinden, können Sie diese Eigenschaft abrufen, und Sie erhalten den Namen des Typs dieses Objekts. Mit einem Shared-Member erhalten Sie die Eigenschaft für einen bestimmten Typ, sodass Sie einfach eine Eigenschaft dieses Typs abrufen können.

Gewünscht Beispiel:

Lassen Sie uns sagen, dass Sie eine Form haben, die wissen, wie sie sich auf dem Bildschirm zu zeichnen. Sie könnten mit einer Base Shape Klasse mit einer Base Shape-Klasse mit einer Draw Methode beginnen und erben dann diese Klasse in zum Beispiel Square und Circle Klassen. Sie könnten dann ein Verfahren wie dieses:

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

In diesem Fall ist es sinnvoll, die Draw Methode in den abgeleiteten Klassen außer Kraft zu setzen macht da tun Sie einfach so erlaubt Draw zu nennen, wo Sie eine Shape Bezug haben und wissen, dass es wird korrekt gezeichnet. Wenn das Verfahren geführt wird ein Square dann wird ein Quadrat gezeichnet und wenn es passiert ein Circle dann würde ein Kreis gezogen werden, aber die Methode muss nicht wissen oder Pflege, dank Polymorphismus.

Wenn das, was Sie vorschlagen, obwohl war möglich, und Draw war ein Shared Methode, würden Sie haben Square.Draw rufen jedes Mal, jedes Mal wenn man wollte ziehen einen Kreis ein Quadrat und Circle.Draw zeichnen wollten. Der Hauptpunkt des Überschreibens ist, dass Sie in der Lage sein sollten, die Methode für eine Referenz des Basistyps aufzurufen und Funktionen zu erhalten, die im abgeleiteten Typ definiert sind.In Ihrem Szenario müssten Sie die Methode für den abgeleiteten Typ aufrufen, um die Funktionalität im abgeleiteten Typ zu definieren, sodass Sie keinen Vorteil erhalten. Du könntest nicht einfach Shape.Draw anrufen und etwas Nützliches passieren lassen. Abgesehen von allem anderen, welche abgeleitete Klasse würde es wählen?

+0

Ich habe Schwierigkeiten, Ihren Standpunkt hier zu verstehen. Kannst du bitte einen Beispielcode posten? – dotNET

+0

Beispiel bereitgestellt. – jmcilhinney

+1

Danke für die Erklärung, aber Sie beschreiben hier nur den Objektpolymorphismus. Mein aktuelles Problem bleibt ungelöst. Was ist die richtige Methode, um abgeleitete Klassen zum Freigeben eines gemeinsamen Members zu zwingen? Wir können dies mit 'MustOverride' für nicht freigegebene Mitglieder tun, aber es scheint keine Möglichkeit für gemeinsame Mitglieder zu geben. Die Problemaussage hier ist einfach: Wenn eine Kindklasse ein 'DrawingObject' ist, hat sie einen' TypeName', der übrigens für alle Kindklassenobjekte gemeinsam ist (daher 'Shared'). Jetzt sollte es einen Weg für die Basisklasse geben, um es auf seine Kinder zu zwingen. – dotNET