So-net無料ブログ作成

Zope interface とは [Zope 3]

Zope 3 では、Zope 3 の開発過程で発明された zope.interface というのを使っています。
twisted でも、この zope.interface を使ってます。
じゃ、ここでいう interface っていうのは何なんでしょうか?

ひとことでいうと、
「クラスのインスタンスがどんなメソッドを持っているか外部(そのインスタンスを使う側)に知らせるもの」
でしょうか。
宣言しているところを見ると、C++ の抽象基底クラスみたいなもんです。
(宣言だけあって実装コードがない)

Java にも interface っていうのがあって、zope.interface に似ているように思えます。
でも、私は Java の interface とはちょっと違うと思います。
私は、 Java のことをとやかく言える程の人間ではありませんが、Java の interface は、
1.Java は多重継承ができないので、制限された Class として継承する基底のもの
2.Class の外部からアクセスできる機能を提示するもの
の意味があると思います。
そもそも Python では、多重継承ができるので(できれば偉いってわけじゃありませんが)zope.interface には、1. の必要はありません。
で、zope.interface って、2. の意味合いで存在していると思うんです。

だから、zope.interface は、Java の interface じゃなくて、むしろ Microsoft の COM(Component Object Model) のインターフェースに似てるなぁと思ってます。

http://www.zope.org/Wikis/DevSite/Projects/ComponentArchitecture/Zope3Book/components.html
によると、Mozilla API っていうのが、Zope 3 の Component Architecture に似てるそうです

「じゃあ、COM のインターフェースって何?」っていうのにちょうど良さそうな文章発見。
COM プログラミングの基本(上)
http://www.microsoft.com/japan/msdn/thisweek/combasics/combasics1.asp
(中とか下になると、COM 固有な話になるので、COM については知りたくない人は上だけ読めばいいかと)

COM で C++ の場合、QueryInterface() で、インターフェースを取得して、そのメソッドを呼び出してますが、(同時にインターフェースが実装されているかどうかも判定)同じようなことを Zope3 でもやってます。

たとえばクラスのインスタンス foo について、IFoo インターフェースで定義されてるメソッド fooMethod() を呼びたい場合

COM の場合

foo->QueryIntreface(IID_IFoo, &pi)
if (pi) {
  pi->fooMethod()
}


zope.interface の場合

if IFoo.providedBy(foo):
  foo.fooMethod()
else:
  print "not implements fooMethod()"


みたいな感じ。
#ん、そうすると zope.interface では、異なるインターフェースで同じ名前のメソッドが宣言できないのか
Zope3 では、あるクラスがどのクラスを継承してるか?ではなくて、どのインターフェースを implements しているかが問題なんです。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0