オブジェクト指向 ・ Chapter 9
インターフェース
記事 ・ 冒頭を無料公開中
前の章の最後に残した違和感を回収します。通知システムの親クラス Notification の send は「とりあえずの実装」で、実際に使われることはありませんでした。欲しかったのは実装ではなく、「sendというメソッドを持っていること」という約束だけ。
その「約束だけ」を書くための道具がインターフェースです。現代のオブジェクト指向で、おそらく一番の働き者です。この章を越えると、後で出てくる設計原則とデザインパターンの話が全部つながるようになります。
interfaceは、約束だけを書く
構文から見ます。interface は、メソッドの名前と型だけを並べたものです。中身(実装)は書きません。
interface Notifier {
send(message: string): void;
}
「Notifierであるとは、send(message: string): void というメソッドを持っていることである」。これだけです。設計図ですらなく、資格の要件のようなものだと思ってください。
クラスがこの約束を守ることを宣言するキーワードが implements です。前の章の通知システムを、親クラスなしで書き直します。
動きは前の章とまったく同じです。違いは構造にあります。「とりあえずの実装」を持つ親クラスが消え、代わりに **約束(Notifier)**が置かれました。各クラスは何も受け継いでいません。ただ「私はsendを持っています」と宣言し、実際に持っているだけです。ポリモーフィズム(Notifier[] に混ぜて一括処理)は、継承がなくても成立する。これがこの章の第一の発見です。
implements には監視役の顔もあります。約束を破る、たとえば send を書き忘れたり、引数の型を間違えたりしたクラスを書くと、その場で型エラーになります。「Notifierを名乗るならsendを正しく持て」とコンパイラが見張ってくれるのです。
extends と implements の整理
似た位置に書く2つのキーワードを、ここで整理しておきます。
このチャプターの続きは受講生限定です
本文の残り、図解・実行できるコードブロック・演習はプラン加入後に読めます。