Je pense que cela pourrait être une fonctionnalité de langue utile et je me demandais si des langues le prenaient déjà en charge.
L'idée est que si vous avez:
class C
virtual F
statement1
statement2
et
class D inherits C
override F
statement1
statement2
C.F()
Il y aurait un mot-clé appliqué à CF () tel que la suppression de la dernière ligne de code ci-dessus provoquerait une erreur de compilation car il dit "Cette méthode peut être surchargée mais l'implémentation ici doit être exécutée quoi qu'il arrive".
programming-languages
Aaron Anodide
la source
la source
Réponses:
Oui, ils le font. Il est appelé modèle scandinave d'OO, il est utilisé par exemple dans Simula (l'autre modèle OO qui est largement répandu et pris pour acquis maintenant, est le modèle américain). Dans le modèle scandinave, vous ne remplacez pas, mais fournissez un sous-comportement.
dans la méthode foo de Superclass:
dans la méthode de la sous-classe foo:
Si vous appelez la méthode foo des instances de Superclass, uniquement
some-code-before
etsome-code-after
se produit (INNER
ne fait rien), mais si vous appelez foo des instances de la sous-classe, c'est le cassome-code-before
,some-code-in-subclass
puissome-code-after
.la source
Aucune langue que je connais n'appelle la méthode surchargée. En effet, certains langages permettent de surcharger les méthodes qui ne sont pas redéfinissables (comme l'utilisation du
new
mot clé en C #). Cependant, il existe deux façons d'aborder cela.La première consiste à créer une méthode non effaçable (par exemple, celle qui n'a pas le
virtual
mot - clé en C # ou celle qui a lefinal
mot - clé en Java) qui appelle une méthode remplaçable qui ne peut pas être appelée de l'extérieur de la classe (par exempleprotected
en C #, Java ou C ++).et
Les classes surchargées
C
sont libres de remplacerF
et de modifier son comportement, mais les appelants de l'extérieur de la classe y accèdent uniquementA
.Edit: Comme d'autres l'ont souligné, cela s'appelle le modèle de méthode Template .
La deuxième façon consiste à utiliser un langage qui applique les préconditions et postconditions spécifiées dans la classe de base, comme Eiffel ou C # avec les contrats de code. Cela ne forcera pas l'appel de la classe de base mais la méthode substituée peut être forcée d'exécuter les mêmes instructions. L'utilisation d' aspects peut également aider si le langage permet d'hériter d'aspects.
la source
private
en C ++ :) Herb Sutter l'explique ici en détail.Ne fait pas vraiment partie du langage, mais l'analyseur de code statique FindBugs pour Java a une annotation
OverrideMustInvoke
qu'un développeur peut ajouter à une méthode, et qui provoquera une erreur de FindBugs s'il trouve une méthode prioritaire qui n'appelle pas la super implémentation . Il permet même de spécifier si l'appel doit être premier ou dernier dans la méthode prioritaire.la source
Exiger d'appeler une méthode de superclasse est un anti-modèle . S'il n'est pas appliqué au moment de la compilation, il est sujet aux erreurs, c'est pourquoi vous recherchez une construction de langage qui le vérifie.
Il existe un moyen pris en charge dans tous les langages OO: le modèle de méthode de modèle . Ici, vous rendez la méthode superclasse non remplaçable et vous y appelez une méthode surchargeable. La sous-classe peut alors remplacer cette méthode pour ajouter des fonctionnalités:
En fonction de l'emplacement de l'appel à la méthode redéfinie, il permet même de déterminer l'ordre d'exécution, qui avec le super appel ordinaire est à volonté de l'implémentateur de la sous-classe.
la source
Le schéma le plus proche auquel je pense est celui des événements auto-souscrits. C'est un peu lourd, et pas du tout intuitif pour le codeur, mais atteint l'objectif.
la source
Les "saveurs" de la machine Lisp autorisaient les méthodes de type "avant" "après" et "autour" de la méthode principale héritée.
la source
Bien que ce ne soit pas une mauvaise idée en théorie, cela a pour effet secondaire négatif de contraindre mes options lors de la mise en œuvre
D
. Par exemple, que faire si (pour une raison insondable), il est plus pratique d'appeler l'implémentation de la superclasse àF
partir d'une autre méthode:Dans votre scénario, j'imagine que le compilateur marquerait l'implémentation de
F
inD
, même s'il appelle (indirectement)C.F()
.Fondamentalement, ce que vous avez décrit est un mécanisme possible pour aider le compilateur à reconnaître quand un contrat sur les classes héritées
C
est violé. Mon point est que, bien que ce soit une bonne chose, cela ne devrait pas se faire au détriment de la façon dont je peux implémenter ma sous-classe.la source