- PR -

変数の継承について

投稿者投稿内容
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2002-07-15 10:16
>今回の例のオブジェクトと
ここは正確には「インスタンス(の実装)」のことでは.

>仮想メソッッドテーブルを
単に「メソッドテーブル」で良いと思います.
仮想関数なんてのは,オブジェクト指向もどき言語C++の用語ですから.
#ちなみにメソッドテーブルも実装依存の部分.

>上で分かると思いますが、フィールドとメソッドでは、状況が少し違います。
>「JIBUN」はオーバーライドされたというより、隠されたと考える
>べきではないでしょうか?

まさにその通りのはずです.
フィールドは「隠蔽」するだけで,メソッドの
オーバーライドとは異なります.
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2002-07-15 12:40
引用:

ここは正確には「インスタンス(の実装)」のことでは.


個々の「インスタンス」の総称として、「オブジェクト」と呼びました。

引用:

単に「メソッドテーブル」で良いと思います.
仮想関数なんてのは,オブジェクト指向もどき言語C++の用語ですから.
#ちなみにメソッドテーブルも実装依存の部分.


私は、ここ(変数の継承について)で、何が問題になってるか、考えるべきだと思います。
質問をしてこられた人達は、フィールドもオーバーライド出来ると考えている訳です。(これは大きな問題ですが…)
フィールドもメソッドも、オーバーライドに関しては表記上の区別がないから、これは誤解しても仕方無い部分があるんじゃないでしょうか?
本来は、バーチャルだからこそ、オーバーライド出来ると私は思っています。
混乱した人達が悪い訳ではないと思いますよ。

最近、C#の勉強もしてますが、C#では基本的にこれらの違いを
フィールドに関しては、子クラスで同名のフィールドを再定義する時は、確か「new」を使います。
オーバーライド出来るメソッドは、基本親クラスで「virtual」指定し、オーバーライドする子クラスでは、「override」指定する仕様です。
「virtual」「override」「new」等の指定は、むしろコードを書く人の意思表明と考えるべきです。
言語(コンパイラ)が処理出来ないからではなくてね。
逆に、構造的な違いを表現する「キーワード」にもなりますから、初めて学ぶ人も分かり易いと思います。

それから、「C++」を悪くいうのは、止めましょうよ。
どんなに言おうが、現在「C」の流れをくむ「オブジェクト指向言語」とそのユーザーは、「C++」から計り知れないものを学んで来てると思います。
それに、「C++」と「Java」の違いは、世代の違いと私は思っています。
「C++」の基本仕様は、時の流れの中で古くなっていく部分があるのは当然だと思います。
(未だに、自分自身を変えられない「C++」が少し可愛そうですが…)
でも、「C++」から学んだ、考え方は未だに色褪せない、本質的なものがあると思います。

「オブジェクト指向もどき」という言葉も、少し酷いですね。
完全なオブジェクト指向言語って何処かにあるんでしょうか?
もし誰かがあると言うのなら、それはただ慢心してるだけです。
それに、現在はオブジェクト指向言語を越えて、コンポーネント指向言語が求められていると、私は思っています。
(コンポーネント指向言語でさえ、もう古くなりつつあるのかも知れません。)

「#メソッドテーブルも実装依存」に関して、
私は実装に依存する話をしてる積もりはありません。
分かり易くと思って、イメージは書きましたが…。
私が話した内容は、そんなに実装に依存したものでしょうか?

でも、基本的な部分に関しては、大きな間違いは無いという事で、安心しました。
それから、皆さんに言いたいんですが…
「C++」じゃないですが、誰でも間違いはします。私もよく間違えます。でもその間違いを如何に本質的な部分から修正出来るか。これが一番大切なんだと思います。
(誰でも、当然の事だと言いますが…)
自分の意見を誤魔化さずにハッキリと言い、また返答が誠実に帰って来るのが、私は一番嬉しいです!

レス、有り難うございました。
takasaki
常連さん
会議室デビュー日: 2002/02/14
投稿数: 31
投稿日時: 2002-07-15 16:28
Java言語仕様第2版を訳したと思われる用語集を見つけました。

http://www.biwa.ne.jp/~mmura/java/javaglossary.html

隠蔽する(hide)
スーパークラスで宣言されたメンバと同じ名前のメンバをサブクラスで宣言すること。

オーバーライド(override)
スーパークラスで宣言された非abstractメソッドと同じシグネチャとなるメソッドをサブクラスで宣言すること。
(abstractメソッドの場合は実装と表現する。またフィールドの場合は隠蔽と表現する。)

とありました。この用語集の元をご存知でしたらどなたか教えてください。
せるふぃっしゅ
会議室デビュー日: 2002/06/27
投稿数: 6
投稿日時: 2002-07-15 17:01
元になっているかどうか分かりませんが、Java言語規定 第2版 の日本語訳です。

http://www.y-adagio.com/public/standards/tr_javalang2/jTOC.doc.html
takasaki
常連さん
会議室デビュー日: 2002/02/14
投稿数: 31
投稿日時: 2002-07-15 17:29
せるふぃっしゅさん、早速ありがとうございます。

Java言語規定 第2版 の日本語訳はわたしも見つけたのですが、
用語集形式になってるものがあるのかな?と思ったので聞いてみました。

http://java.sun.com/docs/glossary.print.html
ともすこし違うので、
http://www.biwa.ne.jp/~mmura/index.html
をみたら、管理者の村上雅章さんがJava言語仕様第2版を訳されているので
オリジナルで作ったものなのかもしれません。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2002-07-15 17:55
とりあえずここだけ.
>「#メソッドテーブルも実装依存」に関して、
>私は実装に依存する話をしてる積もりはありません。
>分かり易くと思って、イメージは書きましたが…。
>私が話した内容は、そんなに実装に依存したものでしょうか?

JavaVMの仕様書を読めば,「実装に依存しない書き方」が
いかに大変か分かると思います.
#JavaVM仕様書も初版では,メソッドテーブルと言う単語を
#使ってますが,第二版では削除されてる個所がある.
#実は一種のミスですね.(^^;

とりあえず「メソッドテーブルを使う/使わない」ってのは
実装依存です.そのようなテーブルを使わず,毎回メソッド
ディスクリプタから動的に呼び出すような実装を取っても,
JavaVM仕様書を満たしていれば,それは正しいJavaVMです.

ただし,実際問題としては結構な率でメソッドテーブルは
使ってるでしょう.とはいえ,ボトルネック部分を
直接インライン展開してメソッドテーブルを介さない形
にする最適化も広く使われてると思います.

この辺の最適化の話も無茶苦茶難しくて,私にも
よく分かりません.
t-wata
大ベテラン
会議室デビュー日: 2002/07/12
投稿数: 209
お住まい・勤務地: 東京
投稿日時: 2002-07-15 19:32
皆さん回答有難うございます。

皆さんの回答と、Java言語規定を読んで少しは理解できるようになりました。

私は、Sun Educational Services のJavaトレーニングテキストI 4-5に書いてある、
--(以下抜粋)
参考-メソッドをオーバーライドしてスーパークラスのメソッドを隠すように、変数
についてもオーバーライドして、スーパークラスの変数を隠すことができます。
------
という部分を読んでメソッドと変数は一緒で、実際変数もfinal宣言する/しないを
選択できるため、「finalでない変数は、オーバーライドできる(メソッドをオーバー
ライドした場合と同じ振る舞いをする)」と激しく勘違いしてました。

ちなみに皆さんはこの継承の仕様にはまってないんですかね?
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2002-07-16 05:33
最初の頃の話では、C++のテンプレートのような
ものを期待しているとも、受け取れますが?
「継承」とはちょっと違いますが.
動的な言語ではどうなんでしょう

[ メッセージ編集済み 編集者: MMX 編集日時 2002-07-16 05:35 ]

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