オブジェクト指向についての高説を観察、の続き2

オブジェクト指向についての高説を観察
オブジェクト指向についての高説を観察、の続き
前回のエントリで多重継承はどうなの?って放り投げたメモったので、多重継承についてお勉強してみる。ちなみに、すでにεπιστημηさんのコメントは読ませていただいていますので、無茶っぽいのを前提にした語り口になるかもしれません。

まず、多重継承とは、「複数のクラスから継承するよ」ってこと。あぁ、まんまですね・・・。orz
で、魔のダイヤモンド問題とおっしゃられるダイアモンド継承っていわれるものが「一つの親クラスを二つ(以上)の子クラスが継承して、その子クラスたちを一つの孫クラスが多重継承した場合、名前の衝突が発生しちゃうよ」ってことのよう。
Visual Basicでは多重継承の実装ができないわけですが、雰囲気を書くと、

Public Mustinherit Class Human

Public MustOverride Sub Greet()

End Class



Public Class Daddy
Inherits Human

Public Overrides Sub Greet()

Console.WriteLine("これはこれは社長〜♪")

End Sub

End Class



Public Class Mummy
Inherits Human

Public Overrides Sub Greet()

Console.WriteLine("あら奥さん♪ちょっと聞きましたぁ〜?")

End Sub

End Class

な感じがあって、おとんとおかんの子を作りたい(多重継承)わけですね。で、この時、おとんにもおかんにもGreet() メソッドがあり、衝突が起きると。

Public Class Baby
Inherits Daddy, Mummy

' これはおとんの?おかんの?
Public Overrides Sub Greet()

End Sub

End Class

なるほど〜。で、このコメント。

επιστημη 『えとね、自然界のモデリングを企てた場合、実装が思い浮かばない。
なので実装を継承する”多重継承”には結びつきません。
加えて自然界のモノはいろんな目線で見てしまうから、互いに独立な性質群を思いつく。
なのでおのずと複数のインタフェースをチョイスしてクラスを構築することになりがちだと思います。
# 多重継承には魔のダイヤモンド問題が鎌首もたげるんでなおさら。』
やっぱりこれなんですよね。自然界は多様すぎる(当たり前ですが。)んですね。自分の中でも理解できている部分なのですが、ふと浮かんだ多重継承に遺伝を夢見てしまっていた、ということです。よくよく考えれば、自然界自体がとてつもなく大きな制約の上に遺伝があるわけですし。

ちなみにC++での実装方法をまったく知らないで書きますが、


Public Class Baby
Inherits Daddy, Mummy

<InheritanceAttribute(Mummy)> _
Public Sub Greet()

End Class

カブったメソッド全部にやってらんないですよ。となると、やっぱりインタフェースベースな考えがしっくりくるのかなぁ。

Public Interface ICommunication

Sub Greet()

End Interface



Public MustInherit Class Human

' Humanクラスは挨拶できる人だけにとどまらないので
' ICommunication は要らないね。

End Class



Public Class Daddy
Inherits Human
Implements ICommunication

Public Sub Greet() Implements ICommunication.Greet

Console.WriteLine("これはこれは社長〜♪")

End Sub

End Class



Public Class Mummy
Inherits Human
Implements ICommunication

Public Sub Greet() Implements ICommunication.Greet

Console.WriteLine("あら奥さん♪ちょっと聞きましたぁ〜?")

End Sub

End Class



' 親が挨拶できるからって子供が挨拶できるってわけじゃないしね。
' 逆もまた然り。
Public Class Baby
Inherits Human
Implements ICommunication

Public Sub Greet() Implements ICommunication.Greet

Console.WriteLine("バブー")

End Sub

End Class

ってことですかなぁ。
# ソース中にコメントでエントリ本文の言いたいこと書いちゃった。