Comment dois-je appeler une méthode de la classe dérivée de la classe de base?
J'ai lu plusieurs questions à ce sujet, mais aucune ne semble résoudre le problème, je suis confronté. La réponse typique est présentée comme la dérivée de la classe, mais je ne peux pas puisque je ne connais pas la classe dérivée de type.
Voici mon exemple:
class WireLessDevice { //base class
void websocket.parsemessage(); //inserts data into the wireless device object
}
class WiFi : WireLessDevice { //derived class
GPSLoc Loc;
}
Appareil sans fil peut également être dérivé de faire le Bluetooth, le Wi-Max, Cellulaire, etc. appareils et donc je ne sais pas quel type de wirelessdevice sera la réception de données.
Quand un GPS paquet est reçu sur le websocket dans la classe de base j'ai besoin de mettre à jour les dérivés de l'appareil emplacement.
J'ai pensé que peut-être l'envoi d'un message via une file d'attente ou la création d'un gestionnaire d'événement et l'envoi de l'emplacement dans les arguments de l'événement, mais celles-ci semblent un peu maladroit lorsque les données est de rester au sein de la classe.
Est-il quelque chose de construit dans la langue qui me permettrait d'appeler mon dérivé de l'appareil de la classe de base sans connaître le type?
Pas besoin d'un décorateur...Prendre un coup d'oeil au résumé ou de méthodes virtuelles...
OriginalL'auteur CramerTV | 2013-04-18
Vous devez vous connecter pour publier un commentaire.
La bonne façon est d'ajouter une méthode DoSomeMagic() dans la classe de base,
à défaut de mise en œuvre, ou abstrait.
La classe dérivée doit de le remplacer pour faire sa magie.
Quelque chose comme ceci peut-être:
Je ne dirais pas SetGPSLocation de la classe de base, mais dans la classe dérivée. Sera mise à jour de ma réponse à démontrer.
Pas sûr, mais je pense qu'un
virtual
méthode doit avoir déclaré du corps. Seulementabstract
méthode n'a pas un corps.correct, ce sera soit virtuel avec un corps ou un résumé
Omer, Votre mise à jour a l'air prometteur. Je ne veux pas utiliser d'abstrait et de tirer l'ensemble de la ParseMessage méthode dans toutes les classes dérivées - c'est beaucoup de code à la réplication et à la maintenance. Ce que vous avez semble parfait pour ce que je dois faire, mais que voulez-vous dire par "virtuelle avec un corps" ou avez-vous mise à jour de l'exemple de l'inclure?
OriginalL'auteur omer schleifer
Méthodes virtuelles serait une bonne solution. Vous créez une méthode
ParseMessage
dans la classe de base qui gère toutes les choses communes à chaque type dérivé, puis remplacer pour des périphériques spécifiques.Afin d'être toujours en mesure de gérer d'autres types de messages, vous aurez besoin d'appeler le
base.ParseMessage
:Si votre classe de base n'est pas de la manipulation de tous les autres messages, le code pourrait être plus simple (et l'aide de
résumé
). Toutefois, dans ce cas, je voudrais envisager de déplacer le web socket code de la classe dérivée.C'est ce que vous obtenez pour répondre à quelqu'un en est la modification de leur poste, mais ouais, il est presque identique. J'ai bien aimé mon explication de mieux, j'ai donc gardé la réponse.
Qui a travaillé beaucoup Thorarin. J'ai modifié votre valeur de retour d'être un type énuméré où le GPS a été l'un des valeurs. De cette façon, le parseMessage routine doit retourner une valeur que dit ce type de message avait été reçu et je n'ai plus de mise à jour de l'emplacement lorsque le message a été analysée correspond à des coordonnées GPS (j'ai peut-être d'autres "cas spécifique" messages-je besoin pour fonctionner sur plus tard.) J'ai aussi inclus une "erreur" type de l'énumération afin que je puisse reconnaître un échec, comme l'exemple ci-dessus. Merci pour votre réponse. Je upvoted vous deux, mais sélectionné Omer réponse simplement parce qu'il était le premier.
Les gars, sûrement le défi est de faire de ce automatiquement, comme elle l'avait fait. Bien sûr, naturellement, vous pouvez remplacer la fonction, puis (si vous voulez) d'appel de base.fonction dans la fonction dérivée. Ce que je me demandais: est-il quelque chose que vous pouvez dire, à la fonction de BASE, ce qui signifie: "ok, si certains bougre se cache cette fonction, puis d'EXÉCUTER CETTE FONCTION PREMIÈRE, et en effet AUSSI des!!! exécuter la fonction dérivée". Est-il un moyen de le faire???
OriginalL'auteur Thorarin