2010-02-15 3 views
2

J'ai une classe abstraite qui nécessite un délégué pour fonctionner. Je passe le délégué dans le constructeur. Maintenant que j'ai un constructeur non par défaut, j'ai besoin d'appeler les constructeurs de la classe abstraite de la classe concrète ce qui signifie que j'ai besoin d'utiliser MyBase.New (...). J'ai inclus un exemple rapide ci-dessous.Puis-je transmettre un délégué dans un constructeur d'une classe abstraite à partir du constructeur d'un descendant?

Public MustInherit Class BaseClass 
    Public Delegate Sub WorkMethod() 
    Private _Work As WorkMethod 

    Public Sub New(ByVal Work As WorkMethod) 
     Me._Work = WorkMethod 
    End Sub 
End Class 

Public Class ConcreteClass 
    Public Sub New() 
     MyBase.New(AddressOf DoSomethingHere) 
    End Sub 

    Public Sub DoSomethingHere() 
     'Do some work here 
    End Sub 
End Class 

J'ai essayé de le faire, mais je continue à obtenir l'erreur suivante: « référence implicite à l'objet en construction n'est pas valide quand appeler un autre constructeur ». Puis-je ne pas faire ce que j'essaie de faire ci-dessus? J'ai d'abord eu l'installation du délégué dans sa propre méthode de setter. Mais alors je crée une API trompeuse car elle nécessite un point à une méthode pour fonctionner correctement.

Répondre

3

Vous ne pouvez pas transmettre un élément appartenant à ConcreteClass car l'objet est toujours en construction lors de l'appel du constructeur de la classe de base. Il ne peut donc pas être utilisé à ce moment-là. L'ajout d'une méthode abstraite à la base semble plus raisonnable.

3

Plutôt que de prendre un délégué, existe-t-il une raison de ne pas spécifier une méthode abstraite dans la classe de base et de l'implémenter dans la classe concrète? Ce serait le moyen normal de réaliser ce genre de chose.

Si vous souhaitez un délégué pour d'autres raisons, vous pouvez toujours le créer à partir de la méthode abstraite de la classe de base.

(Il y a d'autres moments où il est un peu une douleur que vous ne pouvez pas accéder Me/this dans les arguments du constructeur, je ressens votre douleur, mais je pense en utilisant une méthode abstraite est probablement un meilleur ajustement à la situation vous avez décrit.)

+0

Cela fait trop longtemps que je suis là. C'est comme ça que je devrais le faire. Je ne sais pas pourquoi je n'y ai même pas pensé. Désolé de perdre tout le temps. Quelle erreur de débutant à faire. – uriDium

1

Pendant le constructeur de la classe de base, seules les parties de la classe de base de l'objet sont terminées - Il s'agit simplement d'un objet BaseClass jusqu'à ce que le constructeur ConcreteClass soit terminé. Par conséquent, vous ne seriez pas en mesure d'appeler DoSomethingHere dans le ctor de base. Vous ne faites pas cela, mais le compilateur ne le sait pas, et doit supposer que vous le ferez.

Si vous le faites dans une fonction statique (avec ConcreteClass transmis en paramètre), cela devrait fonctionner.

Questions connexes