早速一日サボってしまった…めげずに頑張ろう。
今回は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 件のコメント:
コメントを投稿