Personal tools
You are here: Home ブログ 井上 抽象クラスとは?、と聞かれた時の対応
« December 2010 »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Recent entries
Apache2.4のリリース予定は来年(2011年)初め(あくまで予定) inoue 2010-12-23
Herokuの発音 inoue 2010-12-20
雑誌記事「ソフトウェア・テストPRESS Vol.9」の原稿公開 inoue 2010-12-18
IPA未踏のニュース inoue 2010-12-15
労基法とチキンゲーム inoue 2010-12-06
フロントエンドエンジニア inoue 2010-12-03
ASCII.technologies誌にMapReduceの記事を書きました inoue 2010-11-25
技術評論社パーフェクトシリーズ絶賛発売中 inoue 2010-11-24
雑誌連載「Emacsのトラノマキ」の原稿(part8)公開 inoue 2010-11-22
RESTの当惑 inoue 2010-11-22
「プログラマのためのUXチートシート」を作りました inoue 2010-11-19
「ビューティフルコード」を読みました inoue 2010-11-16
Categories
カテゴリなし
 
Document Actions

抽象クラスとは?、と聞かれた時の対応

時々、「抽象クラスとは何か説明してください」と面接で質問することがあります。得意言語はJavaです、と言う人に使う質問です。Javaというのはプログラミング言語として洗練されていると思っています。なので、はっきり言うと言語的なところで聞くことがあまりありません。他のプログラミング言語だと、はまる要因となる構文規則や変なライブラリとかあって、あれは困ったとか、バッドノウハウの知見などで話が盛り上がれます。そういう話をしていれば相手の力量もおのずと分かります。Javaはこの手の話が相対的に少ないのです。ジェネリックスで new T() みたいに書けないのがけしからん、と愚痴を言う人もいますが、初めから無いと思えば関係無いですし、Javaしか知らない人からは出てこない話です。

かと言って、java.util.Listに要素を追加するメソッド名はなんですか、とは聞きません。メソッド名を覚えていることは、どうでもいいことだからです。==とequalsの違いを答えてくださいという質問も、さすがに程度が低すぎて聞く気になれません。

そんなわけで、「抽象クラスとは何ですか」や「抽象クラスをなぜ使いますか」ぐらいでも聞いておくか、となります。ひとつの正解があるわけではないですが、以下ぐらいの回答が返ってくることを期待しています。

抽象(abstract)そのものの直截的な意味は、インスタンス化(具象化)をしない、という意味です。ただし、(privateコンストラクタで)インスタンス化を禁止するようなクラスと違い、抽象クラス自体はなんらかの具象クラスの抽象基底クラスとして、間接的にインスタンス化に寄与します。抽象基底クラスの使いどころは、ボトムアップ的な視点とトップダウン的な視点で説明できます。ボトムアップ的には、複数のクラスの共通処理をくくりだせます。トップダウン的には、いわゆるテンプレートメソッドパターン的に、処理の枠組や変わらない処理のみを抽象基底クラスにまとめ、具象な処理、固有な処理、変わりやすい処理を下位クラスに追い出せます。

もっと良い答えはいくらでも作れるでしょうが、面接の場でこのぐらい答えてくれれば、もう少し細かい部分に質問を進められます。

いわゆるポリモーフィズム(多態)のことを言及していませんが、個人的には、Javaで多態の役割を担っているのはインターフェースの方だと思っているのではずしました。そこまでインターフェース原理主義になる必要はない、と反論されれば、それはそうです、と返します。抽象クラスの質問に対して多態を答えてくれてもまったく問題ありません。その場合、そっち方面に話が移ります。結局のところ、抽象クラスの質問は次への質問のきっかけ作りのためだからです。

質問をだしておいてなんですが、抽象クラスを説明できることがそんなに重要だとは思っていません。答えられなくても、自分の中にある感覚を説明しようとする態度があれば良い印象を持ちます。しかし、本に書いてあった説明を思い出して答えるような態度には良い印象を持ちません。

汎化という言葉を知らなくても、共通したコードをまとめる感覚があることの方が大事です。テンプレートメソッドパターンという言葉を知ることもよりも、具象な処理や変わりやすい処理を外に追い出す感覚を持つことの方が大事です。追い出す感覚があれば、追い出し方は継承である必要もありません。委譲で追い出してもいいわけです(これをデザインパターンで何と呼ぶか、と質問するかもしれませんが、正直、答えられても答えられなくてもあまり気にしません)。

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/inoue/q-abstract-class/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.