オブジェクト指向についての高説を観察、の続き2
オブジェクト指向についての高説を観察
オブジェクト指向についての高説を観察、の続き
前回のエントリで多重継承はどうなの?って放り投げたメモったので、多重継承についてお勉強してみる。ちなみに、すでにεπιστημηさんのコメントは読ませていただいていますので、無茶っぽいのを前提にした語り口になるかもしれません。
まず、多重継承とは、「複数のクラスから継承するよ」ってこと。あぁ、まんまですね・・・。orz
で、魔のダイヤモンド問題とおっしゃられるダイアモンド継承っていわれるものが「一つの親クラスを二つ(以上)の子クラスが継承して、その子クラスたちを一つの孫クラスが多重継承した場合、名前の衝突が発生しちゃうよ」ってことのよう。
Visual Basicでは多重継承の実装ができないわけですが、雰囲気を書くと、
な感じがあって、おとんとおかんの子を作りたい(多重継承)わけですね。で、この時、おとんにもおかんにもGreet() メソッドがあり、衝突が起きると。Public Mustinherit Class Human
Public MustOverride Sub Greet()
End Class
Public Class Daddy
Inherits HumanPublic Overrides Sub Greet()
Console.WriteLine("これはこれは社長〜♪")
End Sub
End Class
Public Class Mummy
Inherits HumanPublic Overrides Sub Greet()
Console.WriteLine("あら奥さん♪ちょっと聞きましたぁ〜?")
End Sub
End Class
なるほど〜。で、このコメント。
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 ICommunicationSub Greet()
End Interface
Public MustInherit Class Human
' Humanクラスは挨拶できる人だけにとどまらないので
' ICommunication は要らないね。End Class
Public Class Daddy
Inherits Human
Implements ICommunicationPublic Sub Greet() Implements ICommunication.Greet
Console.WriteLine("これはこれは社長〜♪")
End Sub
End Class
Public Class Mummy
Inherits Human
Implements ICommunicationPublic Sub Greet() Implements ICommunication.Greet
Console.WriteLine("あら奥さん♪ちょっと聞きましたぁ〜?")
End Sub
End Class
' 親が挨拶できるからって子供が挨拶できるってわけじゃないしね。
' 逆もまた然り。
Public Class Baby
Inherits Human
Implements ICommunicationPublic Sub Greet() Implements ICommunication.Greet
Console.WriteLine("バブー")
End Sub
End Class
# ソース中にコメントでエントリ本文の言いたいこと書いちゃった。