В чем разница между "методом класса" и "статическим методом"?
Я работал с несколькими разными языками, такими как Java, C# и Objective-C.
В большинстве языков методы, которые не требуют экземпляра объекта, называются статическими методами. Однако когда дело доходит до Objective-C, некоторые люди начинают защищаться, когда вы называете их статическими методами, и они ожидают, что вы будете вызывать их методами класса.
Почему они называются методами класса вместо статических методов? В чем разница между статическим методом и методом класса?
5 ответов
Поэтому мой вопрос: почему они называются методами класса, а не статическим методом? В чем разница между статическим методом и методом класса?
Из Википедии: Статические методы не требуют экземпляра класса и не могут неявно обращаться к данным (или этому, себе, Я и т. Д.) Такого экземпляра.
Это описывает точно, что методы класса Objective C не являются.
Метод класса Objective C очень требует экземпляра, который является целью вызова метода. То есть требуется экземпляр метакласса, который описывает вызываемый объект класса.
В отличие от статических методов, методы класса Objective-C могут быть унаследованы (что, в сочетании с вышеупомянутым self
, именно поэтому многие классы могут совместно использовать одну простую реализацию +alloc
на NSObject
без необходимости собственных пользовательских реализаций) и вызов метода класса проходит точно так же objc_msgSend*
Механизм диспетчеризации основан на любом другом методе вызова сайта.
Методы класса Objective-C могут быть переопределены по всей иерархии классов, и они могут быть изменены. Ни один из которых не поддерживается в языках, которые обычно предлагают статические методы вместо методов класса.
Суть в том, что статические методы и методы класса очень разные. Хотя это различие в основном прозрачно для повседневного кодирования, все еще существуют ситуации, когда знание того, как работают методы класса, может сэкономить вам массу ненужных строк кода.
Например, вы не можете сделать это с помощью статических методов:
@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 ...
}
Потому что он динамически связан, а не статичен.
Потому что это действительно метод экземпляра объекта класса.
Метод класса Objective C на самом деле является методом экземпляра объекта класса объекта.
Это сложно описать с помощью текста. Смотрите хорошую иллюстрацию здесь.
http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html
Хотя методы класса и статические методы в большинстве случаев одинаковы, они различны. Со статическими методами класс действует как классификатор пространства имен. С методами класса сам класс является объектом, и поэтому методы класса относятся к объекту класса точно так же, как методы экземпляра к экземпляру; как следствие вы можете сделать следующее
@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 вызывается, зависит от того, является ли объект объектом класса или экземпляром. Если вы знакомы с шаблоном фабричного класса, этот шаблон является частью языка Objective-C.
Это чисто историческое различие, в основном проистекающее из того факта, что Objective-C был разработан одновременно с C++, и до C++ или более поздних языков, таких как Java и C#, имели большое влияние. Objective-C был, по сути, портом объектной модели Smalltalk на C, поэтому его синтаксис и терминология не обязательно должны выглядеть как "C-like", как в C++. Однако Objective-C никоим образом не противодействовал тенденции, не используя термин "статический метод", потому что эта тенденция не была устоявшейся в 1983 году.
Метод класса. Методы класса в ООП — это методы, которые привязаны к классу, а не к экземпляру класса. Они определены в определении класса, и доступ к ним осуществляется с использованием самого класса, а не экземпляра класса. Декоратор @classmethod используется для определения метода класса.
Тогда как
Статический метод. В ООП статический метод — это метод, принадлежащий классу, а не экземпляру класса. Он связан с самим классом, а не с конкретными объектами, созданными из класса. Статические методы можно вызывать непосредственно в самом классе без необходимости создания экземпляра. Здесь используется декоратор @staticmethod.
Кроме того, существует еще один метод, называемый методом экземпляра. Вы можете прочитать различия здесь.