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

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

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

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


person aryaxt    schedule 11.11.2011    source источник
comment
Нет никакой разницы, но классы в Objective-C имеют Class экземпляров (например, +[NSObject class]), которые сами по себе являются полноценными объектами со своими собственными методами.   -  person Sedate Alien    schedule 11.11.2011
comment
Статический метод в C ++ похож на метод класса в Objective C, но статическая функция в C - это совсем другое. Так что, если вы назовете это методом класса, это будет немного менее двусмысленно и, я думаю, не запутает программистов на C. Поскольку Objective C является надмножеством C, у вас может быть статическая функция в Objective C. Таким образом, в Objective C есть только одно точное значение static, и метод класса, не так ли.   -  person morningstar    schedule 11.11.2011
comment
@SedateAlien - Да, и полная объектность экземпляров Class делает термин "метод класса" еще более запутанным.   -  person Hot Licks    schedule 11.11.2011
comment
@DanielRHicks Я полагаю, это имеет смысл, если вы думаете об этом как о методе объекта class.   -  person Sedate Alien    schedule 11.11.2011
comment
@SedateAlien Между статическими и классовыми методами огромная разница. См. Ответ bbum ниже.   -  person occulus    schedule 14.01.2013


Ответы (4)


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

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

Это точно описывает, чем методы класса 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 ...
}    
person bbum    schedule 11.11.2011
comment
@bburn, я не знаю, откуда вы взяли свои java и c ++, но статические методы наследуются так же легко, как и любой другой метод, если декларации public. Этот ответ верен в отношении ObjC, но он неверен и вводит в заблуждение относительно предполагаемого различия между «методом класса» и «статическим методом»; нет такого различия, кроме как в вашей голове. Кроме того, вы забыли упомянуть единственное, что может напоминать различие: классы objC сами по себе являются объектами типа метакласса. - person lurscher; 27.05.2012
comment
Извините, но я должен вам -1, если вы не сделаете правильно и не исправите всю эту вводящую в заблуждение информацию - person lurscher; 27.05.2012
comment
Действительно? stackoverflow.com/questions/4987127/ Может быть, вам стоит показать пример методов полиморфного класса, использующих в качестве ответа Java или C ++. - person bbum; 27.05.2012
comment
И это: stackoverflow .com / questions / 370962 / - person bbum; 27.05.2012
comment
@bbum, не могли бы вы предоставить пример любого статического метода, который не может быть методом класса - person viral; 12.04.2013

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

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

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

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

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

person eonil    schedule 12.03.2013

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

@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 объектом класса или экземпляром. Если вы знакомы с шаблоном фабричного класса, этот шаблон является частью языка Objective-C.

person Nathan Day    schedule 11.11.2011

Это чисто историческое различие, в основном связанное с тем, что Objective-C был разработан одновременно с C ++ и до того, как C ++ или более поздние языки, такие как Java и C #, имели большое влияние. Objective-C был, по сути, портированием объектной модели Smalltalk на C, поэтому его синтаксис и терминология не обязательно кажутся такими «C-подобными», как используемые в C ++. Тем не менее, Objective-C никоим образом не противоречил тенденции, не используя термин «статический метод», потому что эта тенденция еще не была закреплена еще в 1983 году.

person user57368    schedule 11.11.2011
comment
Также есть точка зрения, что static в C ++ перегружены тремя способами. Вероятно, этот термин использовался для статических методов отчасти, чтобы избежать введения нового зарезервированного слова в язык (чтобы лучше поддерживать совместимость с C). - person Hot Licks; 13.11.2011
comment
@ Джим Тио: Я думаю, он был отклонен, потому что это неправильно. Метод класса - это не то же самое, что статический метод в Java. - person JeremyP; 15.05.2012
comment
Я проголосовал против, потому что это неправильно. И Eonil, и bbum хорошо объясняют разницу. Статическая функция не сильно отличается от бесплатной. С другой стороны, метод класса - это виртуальный метод объекта класса. Поскольку C ++ и Java не имеют объектов класса, они также не могут иметь методов класса. - person Erik Engheim; 21.05.2013
comment
Возможно, статические методы в C ++ и Java работают иначе, чем методы классов в Objective-C и Smalltalk, но я бы все равно называл их методами класса (как и Спецификация языка Java: метод, объявленный статическим, называется классом метод.). Просто разница в природе языков. Мне всегда не нравилась перегрузка static в C ++ (и все, что было вдохновлено ею), и я предполагал, как @HotLicks, что ключевое слово class не было введено просто для того, чтобы не нарушить код. - person big_m; 02.11.2015