В чем разница между "методом класса" и "статическим методом"?

Я работал с несколькими различными языками, такими как Java, C# и Objective-C.

в большинстве языков методы, которые не требуют экземпляра объекта, называются статическими методами. Однако, когда дело доходит до Objective-C, некоторые люди защищаются, когда вы называете их статическими методами, и они ожидают, что вы назовете их методами класса.

Почему они называются методами класса, а не статические методы? В чем разница между статическим методом и класс метод?

4 ответов


поэтому мой вопрос в том, почему они называются методами класса вместо статический метод? В чем разница между статическим методом и метод класса?

Из Википедии: статические методы не требуют экземпляра класса и не могут неявно обращаться к данным (или это, self, Me и т. д.) такого случая.

это точно описывает, какие методы класса Objective-C не.

An Метод класса Objective-C очень сильно требует экземпляра, который является целью вызова метода. То есть для этого требуется экземпляр metaclass, который описывает вызываемый объект класса.

в отличие от статических методов, методы класса Objective-C могут быть унаследованы (что в сочетании с вышеупомянутым self, именно поэтому многие классы могут делиться одной простой реализацией +alloc on NSObject без собственные реализации) и вызов метода класса проходит через то же самое objc_msgSend* механизм отправки как любой другой сайт вызова метода.

методы класса Objective-C могут быть переопределены в иерархии классов, и их можно swizzled. Ни один из которых не поддерживается в языках, которые обычно предлагают статические методы вместо методов класса.

суть в том, что статические методы и методы класса очень разные. Хотя эта разница в основном прозрачна для изо дня в день цели кодирования, все еще есть ситуации, когда знание того, как работают методы класса, может сэкономить вам тонну ненужных строк кода.

например, вы не можете сделать это со статическими методами:

@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 ...
}    

хотя методы класса и статические методы на практике то же самое время, они разные. С помощью статических методов класс действует как квалификатор пространства имен. С методами класса сам класс является объектом, и поэтому методы класса относятся к объекту класса точно так же, как методы экземпляра к экземпляру; как следствие, вы можете сделать следующее

@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];

какая версия classOrInstanceMethod вызывается, зависит от того, является ли obj объектом класса или и пример. Если вы знакомы с шаблоном класса factory, этот шаблон является частью языка Objective-C.


потому что он динамически связан, а не статичен.

потому что это действительно метод экземпляра объекта класса.

метод класса Objective-C на самом деле является методом экземпляра объекта класса объекта.

Это трудно описать текстом. Красивые иллюстрации здесь.

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


Это чисто историческое различие, в основном вытекающее из того факта, что Objective-C был разработан одновременно с C++, и до C++ или более поздних языков, таких как Java и c#, имел большое влияние. Objective-C был по существу портом объектной модели Smalltalk для C, поэтому его синтаксис и терминология не обязательно кажутся "C-подобными", как это используется c++. Однако Objective-C никоим образом не отбрасывал тренд, не используя термин "статический метод", потому что этот тренд не был хорошо зарекомендовал себя еще в 1983 году.