web-dev-qa-db-fra.com

Quelle est la différence entre "méthode de classe" et "méthode statique"?

J'ai travaillé avec quelques langues différentes telles que Java, C # et Objective-c.

Dans la plupart des langues, des méthodes qui ne nécessitent pas d'instance d'un objet sont appelées méthodes statiques. Cependant, lorsqu'il s'agit de l'objectif-c, certaines personnes deviennent défensives lorsque vous les appelez des méthodes statiques et qu'elles attendent que vous appelez les 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?

33
aryaxt

Donc, ma question est de savoir pourquoi sont-elles appelées méthodes de classe au lieu d'une méthode statique? Quelle est la différence entre une méthode statique et une méthode de classe?

De Wikipedia: méthodes statiques ne nécessitent pas d'instance de la classe, ni qu'elles ne peuvent accéder implicitement aux données (ou ceci, moi, moi, etc.) d'une telle instance.

Cela décrit exactement les méthodes de classe de l'objectif-C ne sont pas.

Une méthode de classe Objective-C nécessite beaucoup une instance qui est la cible de l'invocation de la méthode. C'est-à-dire que cela nécessite une instance de la métaclasse qui décrit l'objet de la classe invoqué.

Contrairement à des méthodes statiques, les méthodes de classe d'Objective-C peuvent être héritées (qui, en association avec la présentation de ce qui précède self, c'est exactement la raison pour laquelle de nombreuses classes peuvent partager une seule, simple, mise en œuvre de +alloc sur NSObject sans avoir besoin de leurs propres implémentations personnalisées) et invoquer une méthode de classe passe par le même objc_msgSend* Mécanisme d'expédition basé sur tout autre site d'appel de méthode.

Les méthodes de classe d'Objective-C peuvent être remplacées sur la hiérarchie de la classe et peuvent être blanchissantes. Aucun d'entre eux n'est pris en charge dans des langues qui offrent généralement des méthodes statiques au lieu de méthodes de classe.

La ligne finale 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 pour les objectifs de codage quotidien, il existe des situations suivantes dans la mesure où fonctionnent les méthodes de classe peuvent vous faire économiser une tonne de lignes de code inutiles.

Par exemple, vous ne pouvez pas faire cela 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 ...
}    
72
bbum

Parce qu'il est lié dynamiquement, pas statique.

Parce que c'est vraiment une méthode d'instance d'objet de classe.

La méthode de classe Objective-C est en fait une méthode d'instance d'objet de classe d'objet.

Il est difficile de décrire avec du texte. Voir une belle illustration ici.

http://www.sealiesoftware.com/blog/archive/2009/04/14/OBJC_Explain_classes_and_metaclasses.html

4
Eonil

C'est purement une différence historique, principalement issue du fait que l'objectif-C a été développé de manière contemporonnée avec C++, et avant que C++ ou plus tard, des langues telles Java et C # avaient beaucoup d'influence. Objective-c était essentiellement un port du modèle d'objet SmallTalk à c, de sorte que sa syntaxe et sa terminologie ne semblent donc pas nécessairement comme "C-like" comme celui utilisé par C++. Cependant, l'objectif-c n'était en aucun cas une tendance en n'utilisant pas le terme " Méthode statique ", car cette tendance n'était pas bien établie en 1983.

1
user57368