簡體   English   中英

方法檢查 吱吱聲/雜音

[英]Method Inspection Squeak/Smalltalk

我正在嘗試進行一些方法檢查(在 Squeak - Smalltalk 中)。

我想問一下檢查方法是否是抽象方法的方法是什么? 意思是我想寫一個方法,它獲取一個class和一個符號,並將檢查 object 中的方法列表中是否有這樣的符號,它是這個 class 類型,如果沒有找到抽象將返回. 如何檢查方法是否是抽象方法?

提前致謝。

一個方法是抽象的(在 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>>aMethod) isAbstract

但它僅在 aClass 實際包含方法 aMethod 時才有效,並且不適用於超類。

所以你必須遞歸地檢查它,類似於 canUnderstand: 的工作方式。

雖然我不知道您的最終目標是什么,但 Pharo 代碼批評者將識別未定義子類責任的方法。 這可能已經是您想要做的。 另一方面,也值得檢查該測試是如何實現的,看看您是否可以使用部分或全部現有代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM