В чем разница между "методом класса" и "статическим методом"?
Я работал с несколькими различными языками, такими как 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 году.