Le polymorphisme et l'Héritage en Objective-C
J'ai un code en Objective-C et qui veulent faire un Contrôleur de base et utiliser le polymorphisme pour créer des sous-classes. Je suis aussi CS193p stanford cours. Depuis le polymorphisme utilise les méthodes générales pour les différentes classes comment xcode connaître la fonction de chaque sous-classe de les appeler s'ils ont le même nom de fonction?
Aussi, dans la classe de base d'une fonction est appelée, mais les retours nul et a un commentaire disant abstrait. Cette fonction est mise en œuvre dans la sous-classe contrôleur et retourne une valeur. Comment se fait-le contrôleur de base qui fera appel à la sous-classe de la fonction si elle est inférieure dans la hiérarchie? Pourquoi ne pas retourner nil?
OriginalL'auteur user2076774 | 2013-06-21
Vous devez vous connecter pour publier un commentaire.
Polymorphisme:
Polymorphisme en Objective-C est assez standard sous-type de polymorphisme de vous trouver dans la plupart des classes, les langages orientés objets. Cela signifie qu'une instance d'une classe peut également être considérée comme un exemple de l'un de ses super-classes.
En termes plus concrets, cela signifie que votre personnalisé UITableViewCell sous-classe, que nous appellerons MyCustomTableViewCell, peut être utilisé partout où un UITableViewCell est prévu. Si une méthode a un UITableViewCell paramètre, vous pouvez passer une instance de votre MyCustomTableViewCell.
L'inverse n'est pas vrai; si une méthode attend une instance de MyCustomTableViewCell, en passant régulièrement UITableViewCell est une erreur.
Cela fonctionne parce que les sous-classes héritent de l'interface de leur super-classe. MyCustomTableViewCell a automatiquement toutes les méthodes de UITableViewCell (comme prepareForReuse). Les implémentations de méthodes peut être surchargée, mais vous pouvez toujours envoyer les mêmes messages.
Garder à l'esprit que le traitement d'une instance de MyCustomTableViewCell comme un UITableViewCell ne change pas son comportement. Si vous avez remplacé prepareForReuse, vous aurez toujours obtenir votre substituée comportement.
Héritage:
Le concept d'héritage apporte quelque chose d'une vision du monde réel à la programmation. Il permet à une classe qui a un certain ensemble de caractéristiques (telles que les méthodes et les variables d'instance) et puis à d'autres classes qui sont dérivés à partir de cette classe. La classe dérivée hérite de toutes les fonctionnalités de la classe parent et généralement ajoute certaines fonctionnalités de sa propre.
Par la dérivation des classes nous avons créer ce qui est souvent désigné comme une hiérarchie de classe. La classe au sommet de la hiérarchie est connu comme la classe de base ou de la racine de la classe et les classes dérivées comme les sous-classes ou classes enfant. N'importe quel nombre de sous-classes peuvent être dérivées à partir d'une classe. La classe à partir de laquelle une sous-classe est dérivée est appelée la classe parent.
Classes ne doivent pas seulement être dérivée à partir de la racine de la classe. Par exemple, une sous-classe peut aussi hériter d'une autre sous-classe, avec le potentiel pour créer de grands et complexes hiérarchies de classes.
En Objective-C sous-classe ne peut être dérivé à partir d'un seul parent direct de la classe. C'est un concept dénommé l'héritage simple.
Tutoriels:
http://www.tutorialspoint.com/objective_c/objective_c_inheritance.htm
http://www.tutorialspoint.com/objective_c/objective_c_polymorphism.htm
Références:
http://www.quora.com/In-Objective-C-what-is-polymorphism
http://www.techotopia.com/index.php/Objective-C_Inheritance
OriginalL'auteur Imran
Lorsqu'une classe hérite d'une autre classe et met en œuvre des fonctions qui sont également mis en œuvre dans la superclasse elle remplace la mise en œuvre dans la superclasse. Vous faites cela pour ajouter un comportement que vous avez besoin qui n'est pas présent dans la superclasse. Habituellement, vous permettra également de faire appel à la fonction dans la superclasse.
Lorsque vous appelez la fonction à partir d'un autre objet de la fonction à partir de la plus profonde de la super-classe sera appelée. Qui s'appelle le polymorphisme. Si elle ne fonctionne pas de cette façon, vous ne jamais être en mesure d'ajouter des fonctionnalités à des classes.
Ci-dessous quelques peut que m'a aidé à comprendre le principe.
OriginalL'auteur Raymond
Xcode ne sais pas si un objet (en fait un pointeur) de type
UIViewController
est en fait pointant vers un objet d'une sous-classe de type, disonsMyViewController
. Ce seront calculées au moment de l'exécution.À un certain moment au cours de votre programme, vous aurez à "
alloc init
" votreMyViewController
et c'est alors qu'un bit de mémoire est réservé pour un objet de typeMyViewController
. Ensuite vous pouvez laisser un objet de typeUIViewController
point que peu de mémoire, mais la mémoire lui-même ne sera pas changé. Si une fonction est définie à la fois dans la classe de baseUIViewController
et dans la sous-classeMyViewController
il est dit être remplacée et ces informations figurent également dans le peu de mémoire.Avec cet extrait, vous pouvez examiner les objets et leur fonction de mémoire d'adresses:
Si la fonction n'est pas définie dans la classe sous la fonction de la classe de base (une classe plus élevée dans la chaîne d'héritage) sera appelée.
En outre, en objective-c, vous dites "envoyer un message à un objet" plutôt que "la fonction d'une classe est appelé" à insister sur ce fait.
Découvrez l'Apple docs sur les détails sanglants de la messagerie et de l'héritage!
La mémoire pour les objets contiennent un générées par le compilateur structure de données appelée expédition table qui permet à la magie d'appel à la bonne fonction. De Plus, peut-être que vous voulez remplacer
@selector(loadView)
avec@selector(viewDidLoad)
qui devrait être remplacée dans votre sous-classe.OriginalL'auteur user511