【问题标题】:Method Inspection Squeak/Smalltalk方法检查 吱吱声/杂音
【发布时间】:2011-04-30 12:28:45
【问题描述】:

我正在尝试做一些方法检查(在 Squeak - Smalltalk 中)。

我想问检查一个方法是否是抽象方法的方法是什么? 意思是我想写, 获取 classsymbol 的方法,并检查其中是否存在这样的符号 属于此类类型的对象中的方法列表,如果找到将返回 true,如果是抽象的(否则不是)。 如何检查一个方法是否是抽象方法?

提前致谢。

【问题讨论】:

    标签: smalltalk squeak


    【解决方案1】:

    如果一个方法看起来像这样,那么它就是抽象的(在 Java 或 C++ 的意义上):

    myMethod
      self subclassResponsibility.
    

    所以你需要做的就是回答“MyObject>>#myMethod抽象吗?”是回答“MyObject>>#myMethod#subclassResponsibility 的发件人吗?”

    您可以通过将此方法添加到 Object 来回答 那个 问题:

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

    或者简单地在工作区中评估它(当然有合适的替换 #samplesPerFrameSoundCodec):

    (SystemNavigation default allCallsOn: #subclassResponsibility)
        anySatisfy: [:each | each selector == #samplesPerFrame
            and: [each classSymbol == SoundCodec name]]
    

    【讨论】:

    • 谢谢,我有一个问题。您实际上是否获得了所有抽象方法的数组,然后检查它们是否属于 aClass 并具有 aSelector?难道没有更简单的方法可以通过 aClass 中的 aSelector 的所有方法并检查它们是否发送#subclassResponsibility 而不是通过所有方法而不仅仅是 aClass 中的方法? (当然,除非我完全错了)
    • 试试compiledMethod containsLiteral: #subclassResponsibility
    • @mathk 这几乎就是#isAbstract 所做的。我的肯定更贵,因为它可以找到所有抽象方法。
    • @mathk 谢谢,我使用了hasLiteral。另外,我发现 whichSelectorsReferTo: (on Class) 非常有用。
    【解决方案2】:

    你可以使用

    (aClass>>aMethod) isAbstract

    但它仅在 aClass 实际包含方法 aMethod 时才有效,并且不适用于超类。

    所以你必须递归地检查它,类似于 canUnderstand: 的工作原理。

    【讨论】:

      【解决方案3】:

      虽然我不知道您的最终目标是什么,但 Pharo 代码批评者会确定未定义子类责任的方法。这可能已经是您想要做的。另一方面,也值得检查一下该测试是如何实现的,看看您是否可以使用部分或全部现有代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多