Considérez les classes suivantes représentant un système de commande:
Public Class WebOrder
Inherits OrderBase
Public Overrides Property OrderItem as WebOrderItem
End Property
End Class
Public Class WebOrderItem
Inherits OrderItemBase
End Class
3 Réponses :
Vous ne pouvez pas faire cela - cela change la signature définie sur la base. Pour faire ce que vous essayez de faire, vous devez utiliser des génériques:
Public Class OrderBase(Of T As IOrderItem)
Public ReadOnly Property OrderItems As IList(Of T)
End Class
Votre syntaxe était correcte, mais en allant générique, vous avez manqué une chose: vous n'avez plus besoin de remplacer la propriété - la mise en œuvre de la base sera déjà correcte. De plus, nous serons probablement en mesure d'utiliser une interface plutôt que d'une classe de base pour les ordonnances. Je le nettoyai pour toi.
Aussi - j'ai incorporé mon commentaire sur l'utilisation d'une liste plutôt que d'un tableau. Je n'aime pas ça juste revenir.
Modification de la propriété sur une nervure ultérieure - autre que cela, merci de le formater pour moi.
En fait, c'est ce que j'avais à l'origine, mais cela devient désordonné. Dans le projet réel, la classe d'ordonnance dispose d'une liste de packages et chaque paquet a une liste de commandes. Bientôt, les arguments génériques deviennent un kilomètre long en raison de la nidification des articles. Il en fait également afin que vous ne puissiez jamais retourner une base de commande générique avec la base de paquetage générique et la commande de commande. Je suppose que je ne comprends tout simplement pas pourquoi je change vraiment la signature lorsque le type de retour est une sous-classe?
Dans ce cas, pourquoi changer la signature à tout moment mon commentaire sur l'ambiguïté / l'abstraction (que j'ai oublié, add: p). Si vous souhaitez renvoyer l'abstraction commune la plus basse, la propriété devrait renvoyer une IList (de commande de commande). Laissez les génériques hors de celle-ci et la signature originale seule.
Je sais qu'il y a des façons autour de cela (y compris des génériques ou des interfaces), mais ma vraie question est de savoir pourquoi cela est-il considéré comme modifiant la signature lorsque le type de retour est une sous-classe?
Vous ne pouvez pas modifier la signature de votre classe lors de la priorité. Vous pouvez cependant renvoyer un type dérivé:
Public Class WebOrder
Inherits OrderBase(Of WebOrderItem)
Public Overrides ReadOnly Property OrderItem() As WebOrderItem
Get
Return New WebOrderItem()
End Get
End Property
End Class
Malheureusement, cela ne permettra pas à quelqu'un d'exercer. Tenez une liste d'objets qui représentent certaines sortes de Base de commande, appelez OrderItem et d'obtenir des objets dérivés de PerdrateDeTembase. On pourrait faire cela avec des interfaces covariantes, cependant.
Une approche est d'avoir une méthode protégée une méthode excessive, puis d'avoir une méthode publique non-utilive qui appelle la nervure ultérieure. Chaque fois que la valeur de retour de la fonction dans la classe dérivée doit modifier, poser une substitution notoverridable de la méthode ultérieure appelle une nouvelle méthode ultérieure qui renvoie plus le type plus raffiné, ainsi que Shadow la version antérieure de la fonction publique avec celle qui utilise le Nouvelle substitution. Si vb.net a permis à une classe de remplacer et d'ombre du même membre, les choses seraient beaucoup plus propres, mais il n'ya aucun moyen de le faire.
Public Class CarFactory
Protected Overridable Function DerivedMakeCar() as Car
' make a car
End Function
Public Function MakeCar() as Car
Return DerivedMakeCar()
End Function
End Class
Public Class FordFactory
Inherits CarFactory
Protected Overrides Function DerivedMakeCar() As Car
Return DerivedMakeFord()
End Function
Protected Overridable Function DerivedMakeFord() As Ford
' Make a Ford
End Function
Public Shadows Function MakeCar() As Ford
Return DerivedMakeFord()
End Function
End Class
Définir vos articles de commande en tant que tableau est une mauvaise idée de toute façon. Utilisez une liste ou un iEnumerable.
Dans mon code réel, ils sont des listes. Désolé pour la confusion avec le ().
Voir aussi les réponses à Cette question C # pour des raisons et des astuces / Solutions de contournement. ( C # Signature de la signature "Nouveau" est "ombres" dans vb.net < / a>)