Categories 跟 Posing

OOP 的世界真是博大精深。

最近看了一些 Objective-C (Obj-C for short) Programming 相關的文章(沒錯!是為了在 Mac 上 programming),發現 Obj-C 有一些其它語言少見(或許是我見識淺薄)的一些 OO 特性:CategoriesPosing

過去我們在 OOP 裡要擴充一個 class,最直覺的作法就是去「繼承」它(看 Java 裡用 extend 這樣的關鍵字)然後再去改寫,而 Obj-C 提供的這兩個特性也是為了讓你更方便擴充既有的 class,以下是我自行整理的心得。

Categories

如果你想要為你的 class 增加一些 methods (或是 operation),你可以再實作一個同名的 class 並加上一個分類的標籤,然後只需實作這個分類(Category)下的 method 即可,之後你在程式中使用該 class 的 instances 就可以直接使用這些擴充出來的 operation。

Posing

Posing 這個技術是另一種擴充 class 的方式,在使用 posing 時,你一樣是實作一個 class B 繼承自 class A,然後在程式中宣告讓 B pose as A,如此一來,程式中所有使用到 class A 的地方都會被替換成 class B 了!這個技術適合在你並沒擁有 class A 的原始碼時,又想要改變它行為一個很方便的方式。

不知道還有沒有其它的 OO-based 的語言有這種特性的,不過應該要那種 dynamic typing 的語言才有可能會有吧。

  • scw

    (其實跟 SmallTalk 系的 OO lanuage 不是很熟 XD)

    Categories 很明顯是直接從 SM 繼承來的. SM 是 dynamic type 沒錯, 可是 Objective-C 是 compile luage 而且是 static type 的吧! 另外不是很確定, 但是感覺 traits [1] 是更進一步的切割法.

    Posing 在文件裡看起來不是要給 programmer 用, 而是在 NSObject 要「變身」成其他 class 的時候在用的. 在別的語言裡大概可以參考 Perl 裡 Spiffy [2] 這個 module 吧 :p

    [1] N Scharli, S Ducasse, O Nierstrasz, AP Black, Traits: Composable units of behaviour, Proc. of ECOOP, 2003
    [2] http://search.cpan.org/~ingy/Spiffy-0.30/

  • 感謝渣渣大人這麼專業意見,我會好好參考的 😀

  • Obj-c 是 dynamic type