Как мы вызываем метод класса из другого метода класса?

Как правильно вызывать метод класса из другого метода класса?

это

  className methodName

или же

   self methodName

или же

    className class methodName

мы можем использовать self, когда не создаем экземпляр класса?

2 ответа

Решение

Вы хотите использовать self methodName если вы звоните из того же класса. В Smalltalk класс это сам объект, поэтому self methodName в методе класса отправляет сообщение самому себе, т.е. объект класса.

Это также хорошо для сохранения последовательности во время наследования. Представь, что у тебя есть SuperClass а также SubClass, Тогда, если вы используете self methodName где-то в SuperClass, затем в SubClass это будет эквивалентно SubClass methodName потому что объект, выполняющий метод будет SubClass объект. Теперь, если вы жестко закодировали SuperClass methodName тогда это будет то же самое в подклассах, и это, вероятно, не то, что вы ожидаете.

Если вы будете делать className class methodName вы отправите сообщение className class объект, который является экземпляром Metaclass, это, вероятно, полностью отличается от того, что вы ожидаете.

Вот картинка, показывающая основную концепцию иерархии Smalltalk. (полые стрелки - наследство).

Smalltalk классовая иерархия

Короче:

Если у вас есть

SomeClass class >> #someMethod
    "do something"

Тогда вы должны использовать

SomeClass class >> #otherMethod
    self someMethod

или же

OtherClass class >> #otherMethod
    SomeClass someMethod

Второй будет работать для первого случая, но с точки зрения дизайна первый обычно лучше.

С помощью self считается лучшим, потому что вы избегаете дублирования имени класса везде. Что касается работы других, попробуйте и дайте нам знать;) Было бы более эффективно скомпилировать и запустить однострочный метод в вашем образе, чем спрашивать об этом! Исследование и экспериментирование являются частью того, что представляет собой Smalltalk - используйте силу, Люк:)

Другие вопросы по тегам