Метод проверки Squeak / Smalltalk - PullRequest
3 голосов
/ 30 апреля 2011

Я пытаюсь выполнить проверку метода (в Squeak - Smalltalk).

Я хотел спросить, как проверить, является ли метод абстрактным методом ? То есть я хочу написать, Метод, который получает class и символ и проверяет, есть ли такой символ в список методов в объекте, который имеет этот тип класса и если найден, вернет true, если абстрактный (иначе нет). Как я могу проверить, является ли метод абстрактным или нет?

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 30 апреля 2011

Метод является абстрактным (в том смысле, в каком его понимают Java или C ++), если он выглядит следующим образом:

myMethod
  self subclassResponsibility.

Так что все, что вам нужно сделать, чтобы ответить «это MyObject>>#myMethod abstract?»это ответить "is MyObject>>#myMethod отправитель #subclassResponsibility?"

Вы можете ответить на этот вопрос, добавив этот метод в Object:

isMethodAbstract: aSelector on: aClass
    ^ (self systemNavigation allCallsOn: #subclassResponsibility)
        anySatisfy: [:each | each selector == aSelector
            and: [each classSymbol == aClass name]]

илипросто оценивая это в рабочей области (с подходящими заменами для #samplesPerFrame и SoundCodec, конечно):

(SystemNavigation default allCallsOn: #subclassResponsibility)
    anySatisfy: [:each | each selector == #samplesPerFrame
        and: [each classSymbol == SoundCodec name]]
1 голос
/ 30 апреля 2011

Вы можете использовать

(aClass >> aMethod) isAbstract

, но он работает только в том случае, если aClass действительно содержит метод aMethod, и не работает для суперклассов.

Так что вам придется проверять это рекурсивно, подобно тому, как canUnderstand: работает.

0 голосов
/ 02 мая 2011

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

...