2009-07-05 5 views
2

Was ist der Unterschied zwischen einer Klasse mit geschützten Konstruktoren und einer als MustInherit gekennzeichneten Klasse? (Ich programmiere in VB.Net, aber es gilt wahrscheinlich auch für C#).Geschützte Konstruktoren und MustInherit/Abstract-Klasse

Der Grund, warum ich frage, ist, weil ich eine abstrakte Klasse habe, die ich die Konstruktoren in geteilte/statische Methoden konvertieren möchte. (Um einige Einschränkungen hinzuzufügen).

Ich kann dies nicht tun, weil es nicht möglich ist, eine Instanz in der gemeinsamen Funktion zu erstellen.

Ich denke, nur das Schlüsselwort zu entfernen. Wird dies einen Unterschied machen?

Danke.

ETA:

Ich glaube, ich meine Frage beantwortet haben, Wenn ich das MustInherit Schlüsselwort zu entfernen, kann ich nicht mehr die MustOverrides enthalten, die sehr nützlich sind.

In diesem Sinne, gibt es einen Weg um mein Problem?

ETA2:

Um zu klären, kann ich die unten nicht tun, wenn ich das MustInherit Stichwort entfernen?

Public MustInherit MyBaseClass 

    Private Sub New() 
    End Sub 

    Protected Function CreateInstance(ParmList) As MyBaseClass 
    If ParmList is Ok Then Return New MyBaseClass() 
    End Function 

End Class 
+0

Sie sollten angeben, welche Sprache Sie sprechen. – womp

+0

Danke dafür, ich habe aktualisiert, um anzugeben, es ist vb.net oder C# – Jules

Antwort

1

können Sie rufen den Protected Konstruktor mithilfe von Reflektion und die Klasse instanziiert aber Sie können eine abstract Klasse auf diese Weise nicht instanziiert. Sie können MustOverride Methoden in Klassen deklarieren, aber Protected Konstruktor kann nichts auf abgeleiteten Klassen erzwingen.

Sie sollten immer Klassen definieren, die konzeptionell abstrakt sind wie . Protected Konstruktoren können nützlich sein, wenn Sie sie zusammen mit einigen Überladungen von Public bereitstellen, um den abgeleiteten Klassen etwas mehr Funktionalität zu bieten.

+0

Ja, wie üblich, erkannte ich, sobald ich nach dem Posting, dass ich eine abstrakte Klasse benötigt, um die MustOverride-Methoden. Also, um zu klären, kann ich nicht die folgenden tun, wenn ich das Schlüsselwort MustInherit entfernen? öffentliche MustInherit MyBaseClass Private Sub New() End Sub Geschützte Funktion CreateInstance (ParmList) Als MyBaseClass Wenn ParmList Ok ist dann Return New MyBaseClass() End Function End Class – Jules

+0

Das ist ein Durcheinander, Ich habe das Obige zum OP hinzugefügt! – Jules

+0

Jules: Ja, dein Verständnis ist richtig. –

0

Wenn die Klasse nur einen geschützten Konstruktor hat, ist es immer noch möglich, eine Instanz der Klasse zu haben, die eigenständig stehen kann. Es würde erforderlich sein, den geschützten Konstruktor zu umgehen, z. B. mit Reflektion.

Wenn die Klasse als MustInherit markiert ist, ist es nicht möglich, eine Instanz dieser Klasse zu haben. Instanzen können nur von den abgeleiteten/vererbten Klassen erstellt werden.

0

Nicht wirklich sicher, was Sie wollen.

Wenn Sie ein Objekt der abstrakten Klasse erstellen müssen, empfehle ich erstellen Sie eine private Klasse Umsetzung Ihrer abstrakten Klasse und senden Sie es in Ihrem CreateInstanceMethod:

Public MustInherit MyBaseClass 
    Private BaseClassImplementation 
     Inherits MyBaseClass 

     ... 
    End Class 

    Public Function CreateInstance(paramList) as MyBaseClass 
     If paramList Is Ok Then Return New BaseClassImplementation 
    End Function 
End Class 

Wenn Sie jedoch einige hinzufügen möchten Einschränkungen für die Konstruktion, ich empfehle, Ausnahmen zu werfen:

Public MustInherit MyBaseClass 
    Protected Sub New(paramList) 
     If paramList IsNot Ok Then Thow New Exception 
     ... 
    End Sub 
End Class