2009-07-05 8 views
2

Quelle est la différence entre une classe avec des constructeurs protégés et une classe marquée MustInherit? (Je programme en VB.Net mais cela s'applique probablement aussi à C#).Constructeurs protégés et MustInherit/Classe abstraite

La raison pour laquelle je demande est parce que j'ai une classe abstraite que je veux convertir les constructeurs en méthodes partagées/statiques. (Pour ajouter quelques contraintes).

Je ne peux pas faire cela car il n'est pas possible de créer une instance dans la fonction partagée.

Je pense simplement à supprimer le mot-clé MustInherit. Cela fera-t-il une différence?

Merci.

ETA:

Je pense avoir répondu à ma question, Si je retire le mot-clé MustInherit, je ne peux plus compter les MustOverrides, qui sont très utiles.

Dans cet esprit, y a-t-il un moyen de contourner mon problème?

ETA2:

Pour clarifier les choses, je ne peux pas le ci-dessous à moins que je retire le mot-clé MustInherit?

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

Vous devez indiquer de quelle langue vous parlez. – womp

+0

Merci pour cela, j'ai mis à jour pour indiquer que c'est vb.net ou C# – Jules

Répondre

1

Vous pouvez appeler le constructeur Protected utilisant la réflexion et instancier la classe, mais vous ne pouvez pas instancier une classe abstract de cette façon. Vous pouvez déclarer les méthodes MustOverride dans les classes MustInherit mais le constructeur Protected ne peut rien appliquer aux classes dérivées.

Vous devez toujours déclarer les classes conceptuellement abstraites en tant que MustInherit. Les constructeurs Protected peuvent être utiles lorsque vous le fournissez avec certaines surcharges Public pour fournir plus de fonctionnalités aux classes dérivées.

+0

Oui, comme d'habitude, je me suis rendu compte dès la publication que j'avais besoin d'une classe abstraite pour inclure les méthodes MustOverride. Donc, pour clarifier, je ne peux pas faire ce qui suit à moins que je supprime le mot-clé MustInherit? MustInherit public MyBaseClass Private Sub New() End Sub Fonction protégée CreateInstance (PARMLIST) Comme MyBaseClass Si PARMLIST est Ok Puis Retour New MyBaseClass() End Function End Class – Jules

+0

C'est un gâchis, J'ai ajouté ce qui précède à l'OP! – Jules

+0

Jules: Oui, votre compréhension est correcte. –

0

Si la classe a seulement un constructeur protégé, il est toujours possible d'avoir une instance de la classe qui peut se suffire à elle-même. Il faudrait travailler autour du constructeur protégé, par exemple en utilisant la réflexion.

Si la classe est marquée comme MustInherit, il est impossible d'avoir une instance de cette classe seule. Les instances peuvent seulement être créées des classes dérivées/héritées.

0

Pas vraiment sûr de ce que vous voulez.

Si vous devez créer un objet de la classe abstraite, je vous recommande de créer une implémentation de la classe privée de votre classe abstraite et retournez dans votre 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 

Cependant, si vous voulez ajouter un peu contraintes à la construction, je recommande de jeter des exceptions:

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