- PR -

インタフェースと抽象クラスの混合は問題ない?

投稿者投稿内容
がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 2006-06-13 09:20
皆さん、回答どうも有り難うございます。数日臥せっているうちにえらいことになっていてびっくりしました。

何人かの方々に「インターフェースの方がいい」の意味で悩ましてしまったようで、申し訳ありません。私が書いたときは「継承を使うより interface を実装せよ」という意味でした。ネタ元を思い出すのに実は時間がかかってしまったのですが、ネタ元は
"Effective C#"
http://www.amazon.co.jp/gp/product/0321245660/503-7141266-8727919?v=glance&n=1000
です。この本の item 19 に、"Prefer Defining and Implementing Interfaces to Inheritance" とあります。
もう一度読み返してみましたが、「継承は "is a", インターフェースは "behaves like" 」などの有用な情報が得られました(一度読んだはずなのですが)。結構継承を使いまくる人が多いけど、まずは interface を使った方が良くないか考えてから行こうよ、というのが主題でした。セクションタイトルは扇動的ですが、内容は結構まっとうです。

#まだ日本語版は出てないようです。Effective C++ と同じアプローチの本です。ちなみに、Scott Mayers 著ではなく、彼の名は "Consulting Editor" という名誉職になってます。

私の例の場合、それぞれの具象Algorithmクラス "is a" BaseAlgorithm なので(覚えてますか?:)、結局BaseAlgorithmにIAlgorithmの内容を全て入れてしまいました。一部は abstract class として入れてあります。ただ、将来のためにIAlgorithmを残しておき、BaseAlgorithmが実装するという形にしました。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-06-13 11:18
コードを書くときと読むときで分けて考えてみます。

書くときは interface のほうが書きやすいと思います。思い付くままに (abstract ではない) class を作り、その後に必要に応じて interface をどんどん作って、すでに作ってある class に適当に implements していけばよいわけですから。
一方、それを読むときは、その逆になります。interface が class と疎に結び付いているため、interface と class の関係を読み解くのに時間がかかります。もっとも、コードを書くときに、interface と class の関係がなんらかのポリシー(たとえば InterfaceImplementationPair 等?)で定義してあることが明確ならば、そういう難読さには至らないと思います。
要は、interface が作ってあって、それを前提として class が実装されているのならば、interface であろうと abstract class であろうと、さほど違わないと思います。しかし、最初に class を作ってからあとで「リファクタリング」と称して interface を抽出したような作りだと、ホントにリファクタリングになっているのならば良いのですが、そうでないと読み難さが残ってしまうでしょう。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}

スキルアップ/キャリアアップ(JOB@IT)