いや、まだだから

やまだの仮想庭園 ~ いつか実体の伴う日まで

目次

Blog 利用状況

記事カテゴリ

書庫

日記カテゴリ

リンク

継承ってなに?

先週末は、勉強会に行ってきました。

いまさらながら、スピーカーのみなさん、参加者のみなさん、お疲れ様でした。

参加者も過去最大級とのことで、ひとつ気になるのは Blue さんとこにあった話 みたいなことが起こりはしないかなーとか。

願わくば、「勉強させてくれると思ったのに」的な発言で水を差すやからが現れませんように。

 

んで、勉強会。シャノンさんの話で思ったこと。

他の方のツッコミにもありましたが、私も「え?『カーナビのついた車』って、『車』を継承してつくるの?」って思ったクチです。

でもなー、後からカーナビを追加する場合はどうするのよ? ← いまどきそんな奴はいねえってか?

 その場合、インスタンスは『車』(もしくは『カーナビのついていない車』)クラスから『カーナビのついた車』クラスに移行することになるのだろうか?んー、でも、それは実装ベースで考えるから違和感があるだけで、概念としては動的にクラスを移動すること自体には問題ないのかなぁ?

やっぱり個人的には、継承でない方がすんなり納得できそうな気がします。

車ってそれ自体が拡張可能な形になってるはずだから、コードにすればこんな感じになるのかな、と。

#概念と実装は別の話です、ってな話がありましたが、混同しまくりですね。

Pulic Class 車 {

    ...

    private Option オプション装備[];

    ....

    Pulic addOption(Option オプション機器) {

        オプション装備.add(オプション機器);

    }

}

つーと、『カーナビのついた車』って、継承を使わなくても

車 car = new 車()

カーナビ navi = new カーナビ()

car.addOption(navi)

って書き方ができるし、その方がしっくりくるんですが。#いや、比喩的な話ってのはわかっちゃいますけどね。

 

……と、そこで話は終わらなかったりします。

そこでまた(今度は自分に対する)疑問。『カーナビのついた車』って毎回こんな風にして書くのか?それって面倒じゃないか?

最初からカーナビのついている車だったら、車クラスを拡張してコンストラクタでオプション機器を渡せるようにすればもう少しましになるけど、標準装備だったりするとそれをわざわざ引数として渡すのも変。

となると、結果的には継承を使って『カーナビのついた車』を定義してしまいそうな気もします。でも、それって単なる簡略表記だよなぁ。

うーん、継承って何かわからなくなってきました……。もう少し考え直してみます。

#というか、デレゲートって概念的には継承の一種だったりする?

 

……話は変わって。

勉強会にいくと、とにかく何かしなきゃあ、とか思ってしまうところは不思議。

#行ってから、オブ熱にかかってる奴。

んで、いっそのこと、クラスとかオブジェクトとか専門用語いっさい抜きでオブジェクト指向って語れんもんかなー、とか思ったり。

#もちろん、「類」も「対象」も抜き(笑)。

ターゲットは、(IT入門者どころか、)コンピュータもろくに触ったことのないような人、ということで。

あいも変わらず実用性皆無の方向で、ちょっと試行(思考)実験してみようかな、とか。

なにかまとまったら上げてみるかも。いつになるかわからないですけどね。

投稿日時 : 2007年7月24日 1:56

Feedback

# re: 継承ってなに? 2007/07/24 10:03 シャノン

まぁ俺も、そこだけとって見ればやらないと思うんですけどねーw

ただ、「カーナビの無い車にカーナビを付ける」というのに継承を使っちゃ(基本的には)いけないよ、という例と対比したかったので、ああいう苦しい例になってしまった。
機能追加として使うのはダメ、でもこうならいいよ、というわかりやすい例が思いつかなくて。

# re: 継承ってなに? 2007/07/24 10:09 επιστημη

> というか、デレゲートって概念的には継承の一種だったりする?

delegate=委任/委譲ですから、
継承の実現手段のひとつってことでどーでしょか。

class カーナビつき車 : 車 {
 private カーナビ navi;
public void つれてけ(目的地 どこぞ) {
  navi.教えろ(どこぞ); // デレゲー
  ...
 }
}

# re: 継承ってなに? 2007/07/24 10:15 片桐

犬で考えると……

飼い犬=ペットクラスと犬クラスからの相互継承と定義していたときに

飼い犬にハーネス付けると盲導犬クラス
飼い犬にバッグ付けると愛玩犬クラス

は良いけど、

野良犬に鑑札付けて飼い犬クラス

はよくないw

それなら、野良犬にペットクラスを継承させて飼い犬クラスにしてから鑑札付けましょう(ぼそ)

かな?<違うと思うけど(大汗)

# re: 継承ってなに? 2007/07/24 10:45 επιστημη

> 継承の実現手段のひとつってことでどーでしょか。

いや、なんかちがうな。
「なんかしろ」っていわれたときにだれかにやってもらって
自分の手柄にするわけだから、継承とは直接の関係はなさげっす。

# re: 継承ってなに? 2007/07/24 11:54 とっちゃん

デリゲートは委任(委譲)を後付けするための仕組みなので、どっちかと言うと、アドイン的な拡張とか、イベントに近い概念だと思う。

ま、昔ならコールバックと言ったんだろうけどw

なので、継承とはちょっと違うんではないかな?

>うーん、継承って何かわからなくなってきました……。もう少し考え直してみます。

ある瞬間を定義することが、オブジェクト指向でプログラミング(設計を含む)していく上での約束事です。

なので、必ずしも現実世界との完全一致はありえねーですよ。


カーナビにしても、標準搭載なら、最初からカーナビ付きの車クラスもありだけど、それはあくまでも一例だと思う。

実際の車クラスは、かなり動的に付け外しができるようになっていて、いくつかの派生クラスがあったとしても
単にコンストラクタレベルでオプションを自動的にセットアップしているにすぎないとみるべきでしょううw

なので、ファクトリパターンよろしく、工場内で内部実装は完全隠蔽していて、出てくるのはついていようがいまいが車インスタンスになっているとw

内実は、カーナビ付きの車クラスかもしれないけど、それは見た目的にはわからない...
というのが正しいあり方なんじゃないかな?

# re: 継承ってなに? 2007/07/24 18:18 ひろえむ

むふふふふ。 みんな、オブ熱にやられおったわいw

# re: 継承ってなに? 2007/07/25 0:27 やまだ

> 犬で考えると……
飼い犬にハーネス付けてその後でバッグ付けるのと、先にバッグ付けてからハーネス付けるのは全然別物のような気もするけど。
C++だと先に指定した方から先に継承されるから問題ないのか?(と、話を多重継承に飛ばす奴)

> 「なんかしろ」っていわれたときにだれかにやってもらって
> 自分の手柄にするわけだから、継承とは直接の関係はなさげっす。
継承だって、「俺のせいじゃない。こんな俺を作った両親が悪いんだぁ!」ってことなんじゃーないかか思ったりしますが。

> むふふふふ。 みんな、オブ熱にやられおったわいw
あ、ここに感染源がいた。

# re: 継承ってなに? 2007/07/25 8:19 ぽぴ王子

> 勉強会にいくと、とにかく何かしなきゃあ、とか思ってしまうところは不思議。
> #行ってから、オブ熱にかかってる奴。

ヤクザ映画を見に行ったら観客が映画館から怒り肩で出てくるという話を
思い出しました :-)

懇親会だけ出たオイラですら、あーいろいろやらなきゃなーとか思いました。
徹夜した時点でその辺の勢いはなくなっちゃったわけですが(笑)

タイトル
名前
Url
コメント