Quelle est la différence entre "méthode de classe" et "méthode statique"?
J'ai travaillé avec quelques langages différents tels que Java, C# et Objective-C.
Dans la plupart des langages, les méthodes qui ne nécessitent pas une instance d'un objet sont appelées méthodes statiques. Cependant, quand il s'agit D'Objective-C, certaines personnes deviennent défensives lorsque vous les appelez des méthodes statiques, et elles s'attendent à ce que vous les appeliez des méthodes de classe.
Pourquoi sont-ils appelés méthodes de classe au lieu de méthodes statiques? Quelle est la différence entre une méthode statique et une méthode de classe?
4 réponses
Donc, ma question est pourquoi sont-ils appelés méthodes de classe au lieu de a méthode statique? Quelle est la différence entre une méthode statique et un méthode de la classe?
De Wikipedia: les méthodes statiques ne nécessitent pas une instance de la classe et ne peuvent pas accéder implicitement aux données (ou ceci, self, Me, etc.) d'une telle instance.
Ceci décrit exactement quelles méthodes de classe D'Objective-C ne sont pas .
Une méthode de classe Objective-C beaucoup nécessite une instance qui est la cible de l'invocation de la méthode. Autrement dit, il nécessite une instance de la métaclasse qui décrit l'objet de classe invoqué.
Contrairement aux méthodes statiques, les méthodes de classe D'Objective-C peuvent être héritées (ce qui, en combinaison avec le self
susmentionné, explique exactement pourquoi de nombreuses classes peuvent partager une seule implémentation simple de +alloc
sur NSObject
sans avoir besoin de leurs propres implémentations personnalisées) et invoquer une méthode de classe passe exactement par la même objc_msgSend*
mécanisme de répartition basé sur tout autre site d'appel de méthode.
Les méthodes de classe D'Objective-C peuvent être remplacées dans la hiérarchie des classes et peuvent être balayées. Aucun d'entre eux n'est pris en charge dans les langages qui offrent généralement des méthodes statiques au lieu de méthodes de classe.
L'essentiel est que les méthodes statiques et les méthodes de classe sont très différentes . Bien que cette différence soit principalement transparente à des fins de codage au jour le jour, il existe encore des situations où savoir comment le travail des méthodes de classe peut vous faire économiser une tonne de lignes de code inutiles.
Par exemple, vous ne pouvez pas le faire avec des méthodes statiques:
@interface AbstractClass:NSObject
+ factory;
@end
@implementation AbstractClass
+ factory
{
return [[[self alloc] init] autorelease];
}
@end
@interface Concrete1:AbstractClass
@end
@implementation Concrete1
@end
@interface Concrete2:AbstractClass
@end
@implementation Concrete2
@end
void foo() {
Concrete1 *c = [Concrete1 factory];
Concrete2 *d = [Concrete2 factory];
... etc ...
}
Bien que les méthodes de classe et les méthodes statiques soient en pratique les mêmes la plupart du temps, elles sont différentes. Avec les méthodes statiques, la classe agit comme un qualificateur d'espace de noms. Avec les méthodes de classe, la classe elle-même est un objet et donc les méthodes de classe sont à l'objet de classe exactement la même chose que les méthodes d'instance sont à une instance; en conséquence, vous pouvez faire ce qui suit
@interface TestClass : NSObject
+ (void)classOrInstanceMethod;
- (void)classOrInstanceMethod;
@end
...
NSArray * arr = [NSArray arrayWithObjects:
[[[TestClass alloc] init] autorelease],
[TestClass class],
nil];
for( id obj in arr )
[obj classOrInstanceMethod];
Quelle version de classOrInstanceMethod est appelée dépend si obj est un objet de classe ou une instance and. Si vous êtes familier avec le modèle de classe d'usine, Ce modèle fait partie du langage Objective-C.
Parce qu'il est lié dynamiquement, pas statique.
Parce que c'est vraiment la méthode d'instance d'un objet de classe.
La méthode de classe Objective-C est en fait la méthode d'instance de l'objet de classe d'un objet.
C'est difficile à décrire avec du texte. Voir belle illustration ici.
Http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html
C'est une différence purement historique, principalement due au fait que Objective-C a été développé simultanément avec C++, et avant que C++ ou les langages ultérieurs comme Java et C# aient beaucoup d'influence. Objective-C était essentiellement un port du modèle D'objet Smalltalk en C, de sorte que sa syntaxe et sa terminologie ne semblent pas nécessairement aussi "C-like" que celle utilisée par C++. Cependant, Objective-C ne s'opposait en aucun cas à une tendance en n'utilisant pas le terme "méthode statique", car cette tendance n'était pas bien établie retour en 1983.