早速一日サボってしまった…めげずに頑張ろう。
今回はAdapterパターン。自分の理解を書くとこんなところです。
- 実際に動作する既存クラスに新しいインターフェイスを適用する場合に使う
- Adapterは新しいインターフェイスにどの既存インターフェイスを当てるかを書くだけで、ここに具体的なロジックは実装しない
著書では二つの手法が紹介されています。私感としてはこんなところです。
- 継承…AdapterがAdapteeとほぼ同じ感じであれば使う
- 委譲…AdapterとAdapteeが微妙に違っていたり、複数のAdapteeがいたりしたら使う
で、前回同様pythonによるコーディングをしてみた。内容は本と全く同じ。出来れば自分で別の例を試したいのだけど、例が思い浮かばないんです。
実行結果
一箇所コメントアウトしてあるところは、コンストラクタ内で明示的にスーパークラスのコンストラクタを呼んでいるのですが、このコメントアウトを外すと次のようなコンパイルエラーが出ます。原因は…分かりませんでした。
(Hello) *Hello* (World) *World*ソースコード
#!/usr/bin/env python class Banner: def __init__(self, string=""): self.string = string def showWithParen(self): print "(%s)" % self.string def showWithAster(self): print "*%s*" % self.string # Interface class __Print: def __init__(self): raise Exception("this is an interface!") def printWeak(self): raise NotImplementedError def printStrong(self): raise NotImplementedError # Class class Print: def printWeak(self): raise NotImplementedError def printStrong(self): raise NotImplementedError # Case by interface - inheritance class PrintBanner1(Banner, __Print): #def __init__(self, string): super(PrintBanner1, self).__init__(string) def printWeak(self): self.showWithParen() def printStrong(self): self.showWithAster() # Case by class - delegation class PrintBanner2(Print): def __init__(self, string): self.banner = Banner(string) def printWeak(self): self.banner.showWithParen() def printStrong(self): self.banner.showWithAster() def main(): pb1 = PrintBanner1("Hello") pb1.printWeak() pb1.printStrong() pb2 = PrintBanner2("World") pb2.printWeak() pb2.printStrong() if __name__=='__main__': main()PS.
一箇所コメントアウトしてあるところは、コンストラクタ内で明示的にスーパークラスのコンストラクタを呼んでいるのですが、このコメントアウトを外すと次のようなコンパイルエラーが出ます。原因は…分かりませんでした。
TypeError: super() argument 1 must be type, not classobj
0 件のコメント:
コメントを投稿