【前回までの粗筋】
財布からお金が消えた。専門書は高い。
今日はTemplate Methodである。Javaでいう抽象クラスとインタフェースは何が違うのかが理解できていない気がしてきた。
インタフェースの場合はクラスの親子関係から離れて実装できるのだろうか…。
そして以下のコードはPythonである。そもそもJavaの考えをPythonに持ち込む必要があるのだろうか…どれが言語固有の概念でどれがオブジェクト指向プログラミングの概念なのか。
"""Template Method 1つのオペレーションにアルゴリズムの骨格を定義しておき、 その中のいくつかの部分についてはサブクラスでの定義に任せる。 アルゴリズムの構造を変えずにアルゴリズム内のあるステップを サブクラスで再定義する。 """ import abc class AbstructDisplay(metaclass=abc.ABCMeta): """Abstruct Class アルゴリズムの不変部分はここで実装しておく""" @abc.abstractmethod def start(self): pass @abc.abstractmethod def output(self): pass @abc.abstractmethod def end(self): pass def display(self): self.start() for i in range(5): self.output() self.end() class CharDisplay(AbstructDisplay): """Concrete Class 具体的な動きを実装する""" def __init__(self, ch): self.__ch = ch def start(self): print('<<', end="") def output(self): print(self.__ch, end="") def end(self): print('>>', end="\n") class StringDisplay(AbstructDisplay): """Alternative Concrete Class もう一つの具象サブクラス""" def __init__(self, string): self.__string = string def start(self): self.__printline() def output(self): print('|' + self.__string + '|') def end(self): self.__printline() def __printline(self): print('+', end="") print('-' * len(self.__string), end="") print('+', end="\n") def main(): """テスト函数""" c = CharDisplay('Ni!') c.display() s = StringDisplay('And now for something completely different') s.display() if __name__ == '__main__': main()