この章の内容は、本文中にある次の一言に尽きます。
処理の骨組みをスーパークラスで記述し、具体的な肉付けをサブクラスで行っています。新鮮に感じた部分は次の箇所。
- 処理そのもの(templateMethod)はスーパークラスに書き、その処理のアルゴリズムを抽象メソッドで構築する
- 抽象的なスーパークラスからの視点でサブクラスを見る
--
いつも通り、pythonで書いてみました。
実行結果
く け け け け け ガチャ +--------------+ |逃げちゃダメだ| |逃げちゃダメだ| |逃げちゃダメだ| |逃げちゃダメだ| |逃げちゃダメだ| +--------------+ +--------------------------------+ |It is not good ..running away...| |It is not good ..running away...| |It is not good ..running away...| |It is not good ..running away...| |It is not good ..running away...| +--------------------------------+
ソースコード
#!/usr/bin/env python
# -*- coding: utf8 -*-
class AbstractDisplay:
def __init__(self): raise NotImplementedError
def openIt(self): raise NotImplementedError
def printIt(self): raise NotImplementedError
def closeIt(self): raise NotImplementedError
def display(self):
self.openIt()
for i in xrange(5): self.printIt()
self.closeIt()
class CharDisplay(AbstractDisplay):
def __init__(self, ch): self.ch = ch
def openIt(self): print u"く",
def printIt(self): print self.ch,
def closeIt(self): print u"ガチャ"
class StringDisplay(AbstractDisplay):
def __init__(self, string): self.string = string
def openIt(self): self.__printLine()
def printIt(self): print "|%s|" % self.string
def closeIt(self): self.__printLine()
def __printLine(self):
import sys
sys.stdout.write('+')
for i in xrange(len(self.string.encode("sjis"))): # byte-length of sjis is 2 while that of utf8 is 3
sys.stdout.write('-')
print '+'
def main():
d1 = CharDisplay(u"け") # AbstractDisplay's instance
d2 = StringDisplay(u"逃げちゃダメだ") # AbstractDisplay's instance
d3 = StringDisplay("It is not good ..running away...") # AbstractDisplay's instance
d1.display()
d2.display()
d3.display()
if __name__=='__main__': main()
pythonで書くのはpythonの勉強にはなるけど、型がないのでクラス構造が分かりにくくなってしまう問題があります。かといってC++で書くのもなあ
0 件のコメント:
コメントを投稿