-PR-
解決済み

インターフェースについて

  • すぐに回答を!
  • 質問No.81647
  • 閲覧数29
  • ありがとう数4
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 11% (4/34)

いまサーブレットをやっています。

Java言語仕様では、

「インターフェースの定義には、メソッドの定義を書いてはいけない」
(メソッドの定義はそのインターフェースをimplementsしたクラスのなかで
オーバーライドする)

ということになってますよね?

…でも、

APIリファレンスを読むと、
インターフェースHttpServletRequestのメソッドgetParameterには、
「リクエストパラメータの値をString型として返す」と書かれています。

↑これって上記のJava言語仕様と矛盾してませんか?
まるでどこかでgetParameterメソッドの定義がなされているかのようです。

これってどういうことでしょう?
考えれば考えるほど、訳わかりません。とっても混乱中です(-_-)
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル10

ベストアンサー率 64% (73/113)

ああ、余計に説明しすぎている気がするわけですね。もっと抽象的に
「getParameterはなんだかわからないけどとにかくString型を
返す」
だったらわかるのに、と?
実際、implementsするクラスでは、getParameterとしてランダム
な文字列やらあなたの名前やらを返すメソッドを定義してもJava
言語仕様としては間違いではありません。

でもそれじゃあ意味のある名前をメソッドにつけるのも無駄になり
ませんか?「get1」「get2」でもいいような。

あるクラスがインタフェースをimplementsするというのは、
そのクラスが宣言されたメソッドをすべて完備していて、
そのインタフェースの役割を演じることができる、ということを
約束するものです。逆に漏れがあればコンパイラが怒ってくれると。
ですからドキュメントとして各メソッドの役目をある程度解説する
のは、インタフェースの本来の意図を伝えるものとして意味がある
ことです。

比喩としては、「高級アパートというのはバス、トイレ、洗面台を
完備していなければならない」という法律の細則に「バスは体を
洗浄したり湯船で体を暖めるサービスを提供する」とあるのを、
実際にアパートを建築する業者が「そりゃ具体的に説明しすぎて
ないか?まるでどこかにもうあるアパートのことを言ってるみたい
じゃないか」と文句を言っているのに近いです。実際はシャワーだけ
とか、庭の片隅においてあるドラム缶だって立派な「バス」じゃない
か、と。極端な話、ダンボール箱と洗面器だけでトイレと洗面台と
称しても、法律的には違反じゃないけど、人道的にいかがなものか。

「リクエストパラメータの値を返す」でも、十分抽象的ではあります。
実際にはパラメータをこっそりどこかのファイルにログとして
吐き出しておいてから返してもいいし、データベースにためておいて
一番古いものを検索して返してもいい。まずいパラメータの値は
検閲するような仕組みでもいい。要は、それをimplementsした
クラスが、getParameterを「リクエストパラメータの値を
返すメソッド」として使えればいいわけです。それくらいは説明
してくれないと、利用者としては不便です。
お礼コメント
fumi11

お礼率 11% (4/34)

Headさんは専門家の方だけあって、さすがに文章も論理的ですね。
それゆえ頭の悪い僕としては、
Headさんの文章を一度読んだだけでは理解できませんでした。(-_-)??
でももう大丈夫です。
ちゃんと理解できました。(^ー^)


3度も投稿してくださって本当にありがとございます。
とても役に立ちました。
投稿日時 - 2001-05-28 12:28:14
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル10

ベストアンサー率 64% (73/113)

ああ、それは「宣言」と「定義(実装)」を混同してしまっている
のですね。用語の問題だと思いますよ。
インタフェースでは、メソッドの定義、すなわちその中身の
処理について実装を定義することはできません。(if (...) {...}みた
いに)
しかし、どういう名前のメソッドで引き数としてどういう型の
値を受けて、どういう型の値を返すか、を宣言することはできます。
というかそれが目的です。

インタフェースHttpServletRequestを実装するクラスは、
Stringクラスの値を返すgetParameterメソッドを定義しなければ
ならない、とインタフェースでは「宣言」されていることを
表しています。
補足コメント
fumi11

お礼率 11% (4/34)

どうやら、こちらの言葉不足で誤解を与えてしまったようです。

「インターフェースの定義には、メソッドの定義を書いてはいけない」の部分を以下のように訂正します。

「インターフェースの宣言には、メソッドの処理内容を定義してはいけない」

つまり僕が知りたいのは、インターフェース宣言ではメソッドの処理内容を定義してはいけないはずなのに、APIリファレンスを見るとそのメソッドの処理内容というか機能みたいなのが書かれてあるのでおかしいのではないか、ということなんです。
どうぞご存知でしたら教えてください。
投稿日時 - 2001-05-27 10:02:59


  • 回答No.3
レベル10

ベストアンサー率 64% (73/113)

そうそう、実際にソースが見られたらいいんですが、HttpServletRequest
のgetParameterのところは、
String getParameter();
としか書いてないと思いますよ。
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ