Quel est le sens de la réintroduire et de remplacer les directives en Delphi?
Quelle est la différence entre le override
et reintroduce
directives? Et quand devrais-je pas utiliser le inherited
mot-clé dans les méthodes de remplacement?
Vous devez vous connecter pour publier un commentaire.
La référence à la réponse de Jim, qui était excellent BTW, seulement décrit le quand et où utiliser les directives. Une autre partie de la réponse, c'est pourquoi ils ont besoin de toute façon? De nombreuses langues s'entendre très bien sans eux, pas vrai? Lors de la conception des aspects de l'Objet Delphi Langage Pascal, la POO (Programmation Orientée Objet) avait été dans le système depuis plusieurs années. Pendant ce temps, il a été observé que l'utilisation de plusieurs langues qui a adopté ces concepts (Turbo Pascal, C++, etc..) afin de développer des structures d'application souffert de ce que j'ai appelé la "version 2" de problème.
Supposons que vous avez développé un impressionnant cadre à l'aide de la langue X et dégagé comme la version 1. Vos utilisateurs déliré à tout ce qu'il pouvait faire et il est devenu largement utilisé. Rincer avec succès, vous décidez de version 2 avec encore plus de trucs. En particulier, vous vous assurez que c'était entièrement compatible. Soudain, les utilisateurs ont commencé à reporter des comportements étranges. Leurs propres méthodes virtuelles ont été appelés à des moments étranges. Beaucoup ont signalé que l'ancien code ne compile pas avec la nouvelle version. Étrange. Tous les mêmes objets, les méthodes, et la fonctionnalité reste encore à faire. Vous n'avez fait que d'ajouter un peu de virtuel méthodes à des classes de base, certains nouveaux types d'objets, et quelques nouvelles fonctionnalités facultatives. Ce qui s'est passé?
Le remplacer et de réintroduire les directives servent à éliminer ce problème en exigeant que pour réellement remplacer une méthode virtuelle, vous devez utiliser le correcteur de la directive à la place du virtuel directive. S'il vous arrive d'introduire votre propre méthode virtuelle qui a le même nom que l'un de vos ancêtres méthodes virtuelles, le compilateur vous avertit maintenant, mais toujours faire la bonne chose. Dans ce cas, à l'aide de réintroduire, non seulement supprime cet avertissement, il sert également de document de la source que vous avez l'intention de le faire.
Sans le remplacer et de réintroduire les directives, vous ne seriez pas en mesure de faire évoluer en permanence votre cadre sans crainte de briser tous vos utilisateurs. Et si vos utilisateurs avaient à faire massive des modifications à chaque fois qu'une nouvelle version est disponible, alors ils seraient réticents à adopter la nouvelle version. Enfin, à l'aide de "remplacer" permet également le cadre de concepteur de modifier le type de virtuel dans les ancêtres sans casser le code de l'utilisateur. Par exemple, de Delphes, de nombreuses méthodes sont marqués "dynamique" qui est un tableau d'exécution de la méthode formulaire de recherche de polymorphisme. Il n'est pas tout à fait aussi rapide qu'un virtuel régulier de sorte qu'il est généralement utilisé pour les méthodes qui sont rarement remplacée et/ou sont des réponses aux actions de l'utilisateur lorsque la surcharge est de ne jamais remarqué. Supposons que dans la V1 du cadre, une méthode a été marquée par "dynamique", mais dans la pratique, il a fini par être remplacée et l'appelle plus que prévu. Dans la V2, vous pouvez le changer pour "virtuel", sans crainte de l'utilisateur du code cassé.
Delphi Pascal Objet langue n'est pas la seule langue à reconnaître ce problème. C# nécessite l'utilisation d'un "surpassement" directive pour exactement la même raison. Le C++ comité de normalisation est enfin à reconnaître le problème et sommes en train de modifier la langue pour la soutenir... en quelque sorte. En C++, si une méthode de nom et la liste de paramètres correspond à un ancêtre du virtuel, alors il est une valeur de remplacement (même si vous ne dites pas "virtuel" sur le descendant!). Pour la prochaine nouvelle norme C++, si vous spécifiez "virtuel" et les signatures ne correspondent pas, alors c'est une nouvelle méthode virtuelle introduit sur le cours actuel. Si il y a une correspondance de signature avec l'ancêtre et l'écrivain n'a pas l'intention de remplacer, puis le "nouveau" mot-clé est utilisé pour indiquer au compilateur que c'est un nouveau virtuel pour cette classe.
override
mot-clé dans son/Apple Pascal Objet (pour les Mac), très probablement pour la même raison. Et MME QuickPascal qu'il y avait trop. Mais aucun d'eux n'avait unreintroduce
.La remplacer directive est utilisée pour remplacer des méthodes virtuelles dans les classes héritées.
La réintroduire directive est utilisée pour déclarer une méthode avec le même nom que dans la super-classe, mais avec des paramètres différents.
Fondamentalement, la réponse est lorsque vous ne souhaitez pas hérité de la méthode à exécuter. Attention cependant de ne pas permettre à un hérité de la méthode à exécuter peut se casser la fonctionnalité d'un objet hérité dans un indésirable façon, alors assurez-vous de ne pas introduire d'effets secondaires indésirables.
Comme un exemple, imaginez que vous souhaitez pleinement remplacer hérité d'une fonction appelée ApplyDiscount, mais quelqu'un l'a figé le pourcentage de remise dans la classe ancêtre. Si vous appelez de l'héritage ApplyDiscount il remplacera votre code ou de calculer une valeur vous sera alors remplacer; dans ce cas, vous pourriez tout simplement pas appel a hérité et appliquer le rabais de vous-même.
(C'est un exemple artificiel donc si quelqu'un peut penser à une meilleure une, merci de l'ajouter.)
Il existe de nombreux cas où vous ne souhaitez pas appeler hérité d'une méthode redéfinie.
Dans certaines bibliothèques que j'utilise de l'utilisation, de la base de la méthode renvoie une erreur (ENotImplimented ou similaire). Évidemment, dans ce cas vous ne souhaitez pas appeler hérité ou votre code devrait également jeter l'erreur.
Certains de mes classes ont un défaut de mise en œuvre qui fonctionne dans la majorité des cas. La méthode n'est substituée à remplacer la valeur par défaut, et il n'est pas nécessaire d'appeler la valeur par défaut.
Par exemple, la TPS, la fonction (= taxe de vente) sur ma base financière de l'objet renvoie à 12,5% de la ExGst montant et IncGst retourne ExGst + TPS.
Sur mon Revenu de la Rémunération des objets, TPS retourne toujours 0, donc il n'est pas nécessaire d'appeler les hérité de la fonction.