[英]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]]
或者簡單地在工作區中評估它(當然有合適的替換#samplesPerFrame
和SoundCodec
):
(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.