Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

継承の含有関係の説明は難しい

継承クラスとスーパークラスの関係をOOP初心者(数学が得意な人)に説明することになったのですが、思わぬ突込みがはいり、自分がウロタエてしまいました。
「人に説明できて始めて理解できた事になる」とよく言われます。...自分は理解してなかった???

--説明---始
オブジェクトは実業務を抽象かするものです。
複数のクラスを眺めて,因数分解するように,最小公約数を見つけていけば,基本クラスの抽出ができます。
不足分を各クラスの独自メンバーにします。

犬,猫,サルの共通動作として,寝る,食べる,鳴く がありますね.動物クラスにします。云々.....
動物クラスを継承して犬クラスを作り、犬独自のメンバーとして"人に懐く","芸をする" を追加します
結果として,動物クラスは3つのメンバーしかないけれど,犬クラスは5つのメンバーを持つことが可能になります...
.......
--説明---終
 順調だと思っていたら,
--質問---始
 オブジェクトは実社会を反映するものですね。
  動物クラスは,動物を意味しますね。
  犬クラスは、犬を意味しますね。
  犬は動物界のイヌ科であるから、動物の集合体の中にイヌの集合体がある。
  ところが、継承の説明では、動物界をスーパークラスとして、それを包含するイヌ界があることになる。全然、実社会を反映していない。
--質問---終

種の数で弁図を書くとそうなるが、振る舞い動作という切り口で数えて欲しい...言い訳的な解答。
半分も説明し切れませんでした。
動物で説明するのは無理があるなぁ。

投稿日時 : 2007年2月20日 19:11

Feedback

# re: 継承の含有関係の説明は難しい 2007/02/20 19:18 黒龍

最小公約数は最大公約数かな?
という突っ込みはおいておいて。継承における派生というのは包含するのではなく特殊化していくことに注意です。なので動物界をスーパークラスに置くのも至極当然で継承が深くなるにつれ特化する(狭い集合へと向かう)のが派生という概念です。
機能的に付加されていくという実利面からでは理解しにくいかもしれませんね。

# re: 継承の含有関係の説明は難しい 2007/02/20 19:39 シャノン

> 動物の集合体の中にイヌの集合体がある。

そう。
だから、数学的に言えば、動物集合の部分集合としてイヌ集合がある。
継承=特化=部分集合。
ついでに、多重継承=積集合、共用体=和集合。

抽象化の文脈で言えば、動物は「3つしかメンバが無い」のではなく、「どんなメンバが幾つあるか分からないけれど、この3つだけはあることがはっきりしている」と言うべき。
犬も同様で、「どんなメンバが幾つあるか分からないけれど、動物に加えてもう2つはあることがわかっている」ということになる。

# re: 継承の含有関係の説明は難しい 2007/02/20 19:40 シャノン

#もし勉強会のOOディスカッションに出席できていたら、こういう話をしたかった。
#近々Blogに書きます。

# re: 継承の含有関係の説明は難しい 2007/02/20 22:03 渋木宏明(ひどり)

>オブジェクトは実社会を反映するものですね。

実社会における事物の関連を、そのままオブジェクト設計に反映させるのは適切でない場合もあります。

# re: 継承の含有関係の説明は難しい 2007/02/20 23:46 Ognac

皆様ありがとうございます。
 自分の説明力の限界を感じた一瞬でした。
>包含するのではなく特殊化していくことに注意です。
>継承=特化=部分集合。
>そのままオブジェクト設計に反映させるのは適切でない場合もあります。
 自分では納得していることなのに、伝えることが如何に難しいか。これも技術ですね。

動物などの自然界を例に取ってOOPを説明するには,私には厳しいものがあるので,他の例を考えよっと。
DB項目で因数分解を考えていると、正規化の作業と混乱してくるし....奥が深いです。

# re: 継承の含有関係の説明は難しい 2007/02/21 1:04 シャノン

> 実社会における事物の関連を、そのままオブジェクト設計に反映させるのは適切でない場合もあります。

という言葉はよく聞きますが、これには語弊があると思っています。
プログラムを作る前には分析、設計という作業を行いますが、我々が実社会を見る時も、生まれてから今までに培った経験をもとに、常に無意識にこの作業を行っているからです。
結局のところ、現実世界だと我々が思っているものは、現実世界を抽象化して設計した一種のモデルです。我々は抽象化されていない現実世界のありのままの姿を受け入れることはできません。
現実世界も一つのモデルである以上、目的に適したモデルと適さないモデルがあるので、確かに「実社会モデルがそのままプログラムモデルに適するとは限らない」のですが、「実社会も一つのモデルにすぎない」という話はなかなか聞きません。
誰も興味ない話なのかなぁ。

# re: 継承の含有関係の説明は難しい 2007/02/21 21:09 Jitta

それって勉強会で話をしたじゃないですか(^-^;
 動物など、自然界のものをコードと対比するのは難しいです(Jitta)。それよりも、人工物の方がいい(エピさん)。.NET Expert #3 にありますが、「プレイヤー」の例は、秀逸だと思います。
 「再生する」という機能だけがある「プレイヤー」。そこから「DVD プレイヤー」や「カセット プレイヤー」、「CD プレイヤー」が継承されます。DVD やカセットは、再生する方法は違いますが、「再生する」ことは同じ。それぞれの実装者が「再生の方法」を意識する必要はありますが、使用者が方法まで考える必要はない。
 さらに、「カセット プレイヤー」については、「録音する」という機能も追加されている。

# re: 継承の含有関係の説明は難しい 2007/02/21 21:38 シャノン

> 「再生する」という機能だけがある「プレイヤー」。
> 「カセット プレイヤー」については、「録音する」という機能も追加されている。

いやいやいや。

プレイヤーは「どんな機能があるか分からないけれど、再生機能だけはあることが明確になっている」。
カセットプレイヤーは「加えて録音機能があることも明確になっている」。
そしてどちらも「冷凍食品を温める機能があることは否定していない(肯定もしていない)」。

そう考えないと抽象化と言えない。

# re: 継承の含有関係の説明は難しい 2007/02/21 23:57 Ognac

勉強会での話を意識しながら、野心的に試みた訳でして(^-^;
墓穴を掘ってしまいました。
>「どんな機能があるか分からないけれど....」。
 他にイッパイ機能がある(ないかもしれないが)が,使う機能はこれだけだと限定する発想が、やっと実感できた気がします。
勉強会や活字で予備知識を獲た上で、実経験すると大いに前進できた(気がします)。

# re: 継承の含有関係の説明は難しい 2007/02/22 0:55 επιστημη

> そしてどちらも「冷凍食品を温める機能があることは否定していない(肯定もしていない)」。

構築しようとしているモデルには「冷凍食品を温める」か否かは関係ない。
モデルには要らんもんは書かない(いちいち書いてちゃキリがねぇ)。

モデラーが肉屋の親父なら、鳥が飛べるか否かはアウトオブガンチューなのですなー。

# re: 継承の含有関係の説明は難しい 2007/02/22 10:46 シャノン

補足。
プレイヤーが「再生機能しかない」ものだと、継承時に破綻する。
カセットプレイヤーをプレイヤーから派生させた時に、is-a関係を日本語で言うと「録音機能もあるカセットプレイヤーは、再生機能しかないプレイヤーの一種である」…おかしいよね。
継承の目的は「親クラスにない機能を子クラスで追加する」のではなく「親クラスで言及していない機能の有無を、子クラスで明確にする」こと。
要するに「親クラスにあるものは子クラスにもある」はよく知られているけれど、同時に「親クラスにないものは子クラスにもない」。「ない」と「あるかないかわからない」は違う。
ある機能が「ある」のと「ない」のでは、どちらも明確にはなっているという点で抽象度は同じ。「あるかないかわからない」のは抽象度が一段階上。
だから「再生機能しかないプレイヤー」を想定するなら、それは「少なくとも再生機能はあるプレイヤー」の子クラスであり、「録音機能もあるプレイヤー」の兄弟クラスとなるべきなのでした。

# re: 継承の含有関係の説明は難しい 2007/02/23 15:45 Ognac

一旦は納得してたんですが.....。
>だから「再生機能しかないプレイヤー」を想定するなら、それは「少なくとも再生機能はあるプレイヤー」の子クラスであり、「録音機能もあるプレイヤー」の兄弟クラスとなるべきなのでした。
継承先は継承元の許可したメンバーのみ操作可能と考えるのは継承元が許可してやってるんだという視点の感じ。
継承先から見れば,継承元の特定のメンバーのみ用事があるので,他のメンバーがいくら有用であっても用事はないと考えれば、いいのではないでしょうか。

# re: 継承の含有関係の説明は難しい 2007/02/24 11:31 黒龍

いいこと言った>シャノン
ずっと例示されている実利面(振舞)の保障はC#、JAVAなどのmodernなオブジェクト指向言語ではInterfaceでやるべきであって継承はシンプルにオブジェクトを捉えてis-aなのかhas-aなのかを検討がいいですね。

# re: 継承の含有関係の説明は難しい 2007/02/24 14:24 Ognac

うーん.... 継承とインターフェースの使い分け...
自分の中で使い分け基準がハッキリしていないことに気づきました。もやもや感の一因がここにありました。気づかせて頂いてありがとうございます。(頭がついてかない私にとっては)このあたりは実際に経験するのが王道でしょうね。

# re: 継承の含有関係の説明は難しい 2007/02/24 21:23 シャノン

> 継承先は継承元の許可したメンバーのみ操作可能と考えるのは継承元が許可してやってるんだという視点の感じ。
> 継承先から見れば,継承元の特定のメンバーのみ用事があるので,他のメンバーがいくら有用であっても用事はないと考えれば、いいのではないでしょうか。

申し訳ないが、おっしゃることがよくわかりません。
たとえば、具体的にどのように?

> C#、JAVAなどのmodernなオブジェクト指向言語ではInterfaceでやるべきであって

ところが俺はインターフェイス嫌い。
継承は is-a、インターフェイスは be-able-to に使うというのは一理あるけれど、俺は多重継承好き好き派なので。
だから実のところ、be-able-toな継承があってもいいとは思う。でも、あくまで基本思想はis-a。
分析段階で現れない、非機能的なものならbe-able-to継承もいいかな、と。

# re: 継承の含有関係の説明は難しい 2007/02/24 23:18 黒龍

いいこと言ったは取り消し^^;
> カセットプレイヤーをプレイヤーから派生させた時に、is-a関係を日本語で言うと「録音機能もあるカセットプレイヤーは、再生機能しかないプレイヤーの一種である」…おかしいよね。
ありならに突っ込むのはおかしいしbe-able-toな継承こそがInterfaceだと思うんだが・・・。
Interfaceで代替できない多重継承ってやつがモデリング的にすでに失敗ムードなので私は嫌いです。(つぎはぎだらけでキメラやフランケンシュタインっぽい)
ちょっとコメントから立ち位置が見えなかったので突っ込み^^;

# re: 継承の含有関係の説明は難しい 2007/02/25 1:39 Ognac

話について行けない感があるのですが...orz.
「派生クラスに必要なメンバーを公開すれば, スーパークラスの役割は果たす」という見方は出来ませんか?
派生クラスに不必要なメンバーの存在(非公開メンバー含む)の認識するのは無意味な気がするのです。
派生クラスに不要な知識を開発者に意識させるのは混乱の元になる気がします。スーパークラスの実体が立派で巨大なものであっても, 継承先が3つのメンバーしか必要としないのであれば, 3つのメンバーのみで構成される小さなクラスと見えるだけで役目は果していると思うようになりました。
未だすこし混乱してますが。

# re: 継承の含有関係の説明は難しい 2007/02/25 2:09 シャノン

> いいこと言ったは取り消し^^;

わはは、取り消されたw

> ありならに突っ込むのはおかしいしbe-able-toな継承こそがInterfaceだと思うんだが・・・。

「非機能要件的be-able-to継承」と言っているように、「プレイヤーは再生ができる」は俺にとってbe-able-toではないのです。
俺の言うbe-able-toは「Clonable」とか「Serializable」とか「Bindable」とか…

> Interfaceで代替できない多重継承ってやつがモデリング的にすでに失敗ムード

あちこちで言ってますが、俺の発言は現実を見ていません。だからC#やJava向きじゃない発言を平気でする。
たぶん多重継承をうまく扱える言語があったらモデリングの見方も変わるんじゃないかな。

# re: 継承の含有関係の説明は難しい 2007/02/25 2:10 シャノン

> 話について行けない感があるのですが...orz.

ついていけないというか、どういう流れでそういう話になったのか見えてません。

# re: 継承の含有関係の説明は難しい 2007/02/25 2:28 黒龍

> 「非機能要件的be-able-to継承」と言っているように、「プレイヤーは再生ができる」は俺にとってbe-able-toではないのです。
> 俺の言うbe-able-toは「Clonable」とか「Serializable」とか「Bindable」とか…
is-aではなく機能群を使っての継承もありということですね。コンポーネント指向と理解すればいいのかな?
(プレイヤーで例えるなら裸のCDROMドライブとかのイメージかな??いや、それだとただのhas-aか…難しい)

# re: 継承の含有関係の説明は難しい 2007/02/25 20:33 シャノン

> コンポーネント指向と理解すればいいのかな?

思い出した。mixinですよ。
初めからそう言っとけばよかった。

# re: 継承の含有関係の説明は難しい 2007/02/25 23:58 黒龍

よそ様のトピックで変に盛り上がっちゃってすみません>Ognacさん

> 思い出した。mixinですよ。
また揺れのある用語が出てきたが言いたい意味はわかった。
(そりゃ堂々巡りするわな)
多重継承はないんで代入互換性と機能実装はInterfaceとコンポジションに分けるしかないよね。

>こんな感じ?

//クラスでいいけどいろいろ作れるようにinterface
interface MixInModule
{
  void ほげほげ();
}
//MixIn対象の実装
class MixInModuleImpl : MixInModule
{
  public void ほげほげ() { return;/* なんぞ実装 */ }
}

//MixInされていることを強制
interface HaveMixInModule
{
  MixInModule GetMixInModule();
}
class HogeHoge: MixInModule
{
  //多重継承の代わりに所有
  private static readonly MixInModule module = new MixInModuleImpl();

  //取り出しが保障されるので代入互換性の代わりに使用する
  public MixInModule GetMixInModule()
  {
    return module;
  }
}

…やっぱし面倒だなぁ^^;

# re: 継承の含有関係の説明は難しい 2007/02/26 0:50 Ognac

>よそ様のトピックで変に盛り上がっちゃってすみません
いえいえ.. 大いにやってください。非常に勉強になります。
話について行けてない点もあるのですが, (java/.net系では)C++以外では多重継承が禁止されたかの匂いが嗅げた気がします。
シャノンさん>
>たぶん多重継承をうまく扱える言語があったらモデリングの見方も変わるんじゃないかな
C++でははうまく扱えない?。それが可能な仮想言語があったとして、
現実社会の事案で,多重継承のほうがスッキリモデリングできるケースってどの場合でしょう。
 家系図のように先祖を遡るにつれ,先祖が増えるのであれば, 振る舞いの規定/判定が煩雑になって困るのでは...(と既に,否定的になるのはダメですね)

# re: 継承の含有関係の説明は難しい 2007/02/26 10:05 シャノン

> 多重継承はないんで代入互換性と機能実装はInterfaceとコンポジションに分けるしかないよね。

度々言うように、俺は「機能継承を.NETでどう扱うか」の話はしていません。
「Javaや.NETでは多重継承不可」という制限がかけられていますが、それをもって「オブジェクト指向では多重継承不可」という結論を出すべきではないと思います。
その上で、mixinも継承も同じメカニズムで扱える言語があってもいいんじゃない? という話です。

> 既に,否定的になるのはダメですね

そうそう。
多重継承前提で設計されている言語を使うなら、パラダイムシフトが要求されると思いますよ。

#Eiffelをいじろうと思っているばかりでちっとも手をつけてない
#Satherも面白そう。

# re: 継承の含有関係の説明は難しい 2007/02/26 11:28 黒龍

> 度々言うように、俺は「機能継承を.NETでどう扱うか」の話はしていません。
> 「Javaや.NETでは多重継承不可」という制限がかけられていますが、それをもって「オブジェクト指向では多重継承不可」という結論を出すべきではないと思います。
> その上で、mixinも継承も同じメカニズムで扱える言語があってもいいんじゃない? という話です。
「オブジェクト指向では多重継承不可」とは思ってないです。が、DやC++でMix-Inは扱えますが結局のところ実装時の技術だと考えています。(すでにモデリング済みなものを実装する上でどう実装するかってこと)
私もC++でオブジェクト指向を学んだので多重継承の便利さも分かりますがずっと上で述べているように多重継承でのモデリングって継ぎ接ぎっぽくてやです。
私は多重継承は使わないというパラダイムシフトを経てしまったのでC#にMix-Inがはいっても実装時に局所的にしか使わないでしょうね。(モデリング時は前提にしない)
多重継承でモデリングすべきケースってどんなでしょう?

# re: 継承の含有関係の説明は難しい 2007/02/26 11:39 シャノン

> DやC++でMix-Inは扱えますが結局のところ実装時の技術だと考えています。(すでにモデリング済みなものを実装する上でどう実装するかってこと)

というのは、言葉を補えば、「すでに『単一継承前提で』モデリング済みなものを~」となりますか?
であれば、それは黒龍さんが「単一継承パラダイムの中にいるから」です。
そのパラダイムから脱すれば、多重継承をモデリングに生かす可能性も出てくるでしょう。
#脱せよと言っているのではありません。
#むしろ今は脱しない方がいいでしょう。

> 多重継承でモデリングすべきケースってどんなでしょう?

さあ。俺もまだそれを語れる位置にありません。
ただ、それを今否定することはない、というだけです。
俺はその追求をしてみたいのです。

ずっと前にも言ったように、
> 多重継承=積集合
というのも理由の一つです。
オブジェクト指向の概念を数学にマッピングした時に、積集合という非常に基本的な概念がマッピングできないのはおかしい、という思いもあります。

# Hello to every body, it's my first pay a quick visit of this blog; this website carries amazing and genuinely good information in favor of readers. 2019/05/02 19:44 Hello to every body, it's my first pay a quick vis

Hello to every body, it's my first pay a quick visit of this blog; this website carries amazing
and genuinely good information in favor of readers.

# This is my first time pay a quick visit at here and i am in fact happy to read everthing at one place. 2019/05/05 18:08 This is my first time pay a quick visit at here a

This is my first time pay a quick visit at here and i am in fact happy to read everthing at one place.

# Hi just wanted to give you a brief heads up and let you know a few of the images aren't loading properly. I'm not sure why but I think its a linking issue. I've tried it in two different internet browsers and both show the same outcome. 2019/05/06 10:26 Hi just wanted to give you a brief heads up and le

Hi just wanted to give you a brief heads up and let you
know a few of the images aren't loading properly.
I'm not sure why but I think its a linking issue. I've tried it in two
different internet browsers and both show the same outcome.

# I think this is one of the most significant info for me. And i'm glad reading your article. But want to remark on few general things, The website style is perfect, the articles is really great : D. Good job, cheers 2019/05/11 22:12 I think this is one of the most significant info f

I think this is one of the most significant info for me.
And i'm glad reading your article. But want to remark on few general
things, The website style is perfect, the articles is really great :
D. Good job, cheers

# Hello there! Do you know if they make any plugins to safeguard against hackers? I'm kinda paranoid about losing everything I've worked hard on. Any recommendations? 2019/05/12 9:53 Hello there! Do you know if they make any plugins

Hello there! Do you know if they make any plugins to safeguard against hackers?
I'm kinda paranoid about losing everything I've worked hard on. Any recommendations?

# Howdy just wanted to give you a brief heads up and let you know a few of the images aren't loading properly. I'm not sure why but I think its a linking issue. I've tried it in two different browsers and both show the same outcome. 2019/05/13 21:40 Howdy just wanted to give you a brief heads up and

Howdy just wanted to give you a brief heads up and let
you know a few of the images aren't loading properly.
I'm not sure why but I think its a linking issue.
I've tried it in two different browsers and both show the same outcome.

# I visited various web sites but the audio quality for audio songs present at this site is really marvelous. 2019/06/12 20:55 I visited various web sites but the audio quality

I visited various web sites but the audio quality for audio songs
present at this site is really marvelous.

タイトル
名前
Url
コメント