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

Я хочу написать метод, который проверяет список всех суперклассов (метод allSuperclass) и возвращает «истину», если один из них имеет classVariable с определенным именем. Если ни у кого из них нет, он вернет false. Как мне это сделать?


person Shookie    schedule 24.08.2013    source источник


Ответы (3)


classVarNames — это метод, который возвращает коллекцию имен переменных класса.

Например, если вы добавите этот метод в класс Behavior, вы должны получить требуемую функциональность:

 superclassesHaveNoClassVar: name
    ^ self allSuperclasses noneSatisfy: [:class |
        class classVarNames includes: name]

Ничего особенного. Просто возьмите allSuperclasses и проверьте, нет ли среди них includes нужной переменной name classVarNames.

person Uko    schedule 25.08.2013

Просто отправь:

superclass allClassVarNames includes: #AClassVariableName

к рассматриваемому классу. Если вам нужен отдельный метод для этого, вы можете поместить его, как предложил Уко, рядом с allClassVarNames в протоколе Behavior:

superclassesIncludeClassVariable: aSymbol
   ^ self superclass allClassVarNames includes: aSymbol
person MartinW    schedule 25.08.2013

В Squeak есть следующий метод Behavior, который ClassDefinesClassVar:
Вы можете использовать его следующим образом:

^(MyClass whichClassDefinesClassVar: #ThisVariableName) notNil
person aka.nice    schedule 01.09.2013