Visual Basic で○○を作ってみよう。その1。 - とりあえずやってみたらええやん。-
Visual Basic で○○を作ってみよう。その2。 - クラスとかつくってみたらええやん。-
Visual Basic で○○を作ってみよう。その3。 - クラスとかつくってみたらええやん。その2。-
タイトルが内容をさらっと暴露してしまっていますが、凹まずにがんばります。いや、軽く凹みますけどがんばります。
前回の最後にこう↓書いていました。
前回は Bird クラスを作りました。そして今回は飛ぶという振る舞い(Fly メソッド)を持たせました。でもこの Bird クラス、頭の中に浮かんできますか?実は頭の中では、すずめさんやカモメさんといった飛びそうな鳥が浮かんでたりしませんか?あれれ、ペンギンさんが出てきちゃった(←お約束。)なんて人はいませんか?次回はこのあたりを考えていきます。
さくっと書きます。これ以降、
基本クラスとか派生クラスとかについて書きますから!
では基本クラ・・・ちょ、ちょっと待ってください。それより先に解決するべきことがあります。それはペンギンさんのこと(ここでいうペンギンさんは「飛べない鳥」を指します。)です。前回、Bird
クラスは Fly メソッドを持たせました。なぜなら鳥は飛ぶと決めたからです。これによってペンギンさんはどうなるのかといいますと、
ペンギンさんは鳥じゃありません。(ごめんね。
これでペンギンさんについては解決です。だって鳥ではないんですから。逆に言うとペンギンさんを Bird クラス という枠に当てはめるなら、Fly メソッドを実装することが間違っていることになります。('羽が生えてる'とか'くちばし'とかになりますか。それでもはみ出る鳥はいるでしょうけど。)
では、ペンギンさんが好きな方にはここはぐっと我慢していただいて、基本クラスとか、派生クラスとか、ですが、まずはこう考えてください。
鳥って言われてもすずめさんとカモメさんじゃ飛び方が違うよね。
そうなんです、すずめさんとカモメさんは鳥だから飛ぶけど、その飛び方は同じではないのです。でも、間違いなく飛ぶのです、だって鳥ですから。(←言い回しがややこしいw
つまり、前回書いたコード↓の
Public Class Bird
Public Sub Fly()
End Sub
End Class
Fly メソッドの中のコードはすずめさんとカモメさんでは違うものになるね~ってことですね。さらにややこしくなる前にここでそれぞれの飛び方を決めておきましょうか。すずめさんはパタパタ飛びます、カモメさんはスイスイ飛びます。
この鳥は鳥なんだけど、その実体にはそれぞれ個性がある、なんて場合には、基本クラスとか派生クラスとかっていう考え方が有効です。すずめさんもカモメさんも各々が鳥の飛ぶという振る舞いに対する具体的な実装を持つわけですね。
とりあえず、このあたりの参考リンクです。このリンク先から辿れるリンクはどれもとても重要ですよ。
MSDN:Visual Basic の継承(http://msdn2.microsoft.com/ja-jp/library/5x4yd9d5(VS.80).aspx)
すこしちゃんとした言葉で書くと、「Bird クラス(鳥)を継承して Sparrow クラス(すずめさん)と SeaGull クラス(カモメさん)を作成する。」となります。
コードでこの継承を表現するには「Inherits ステートメント」を使用します。これ↓ですね。
MSDN:Inherits ステートメント(http://msdn2.microsoft.com/ja-jp/library/1yk8s7sk(VS.80).aspx)
Class 派生クラス
Inherits 基本クラス
End Class
今回は Bird クラスを継承して、Sparrow クラス と SeaGull クラス を作成しますのでこんな感じ↓ですね。(それぞれSparrow.vb、SeaGull.vbというファイルに記述しましょう。)
Public Class Sparrow
Inherits Bird
End Class
Public Class SeaGull
Inherits Bird
End Class
これでSparrow クラス と SeaGull クラスはBird クラスを継承できました。・・・でも、まだやることはありますよね?そうです、
パタパタとか、スイスイとか
まだ実装してませんよね。あ!そこにいく前にひとつだけ。そもそも鳥ってあいまい過ぎやしませんか?「空を飛んでる鳥」なんて書けますけど、
実際に飛んでるのはすずめさんとかだったりしませんか?
鳥というものは実に抽象的な言い回しなんですね。Visual Basic にも、これを表現する方法があるのです。
MSDN:MustInherit(http://msdn2.microsoft.com/ja-jp/library/aee8f02w(VS.80).aspx)
Inherit に Must がついています。必ず継承しなければならない、です。さらに飛ぶというふるまい(Fly メソッド)も必ず、派生クラスでちゃんと実装を書かなくてはいけませんよね?(パタパタとか。)こちらも
MSDN:MustOverride(http://msdn2.microsoft.com/ja-jp/library/hyb29zk8(VS.80).aspx)
必ずオーバーライドしなければならない、なんてのがあります。オーバーライドについては
MSDN:プロパティとメソッドのオーバーライド(http://msdn2.microsoft.com/ja-jp/library/818x9db9(VS.80).aspx)
あたりを読むとなんとなく分かるでしょうか。さてさて、これらを Bird クラスに書き加えます。
Public MustInherit Class Bird
Public MustOverride Sub Fly()
End Class
あらら、Bird クラスは 必ず継承しなくてはいけないし、Fly メソッドは必ずオーバーライドしなくてはいけなくなってしまいました。Sparrow クラス と SeaGull クラスはBird クラスを継承していますが、Fly メソッドをオーバーライドしていませんね。なのでそのあたりを修正しましょう。基本クラスのメソッドやプロパティをオーバーライドするには Overrides キーワードを使用します。
MSDN:Overrides(http://msdn2.microsoft.com/ja-jp/library/k777kzw1(VS.80).aspx)
Public Class Sparrow
Inherits Bird
Public Overrides Sub Fly()
End Sub
End Class
Public Class SeaGull
Inherits Bird
Public Overrides Sub Fly()
End Sub
End Class
と、こんな感じで、基本クラスと派生クラスをやってみましたよ、と。次回はこれって何のために?なんてあたりが書けるようにがんばりましょうか。
# なんかグダグダ・・・。orz
さて、最後になりましたが、前回のエントリのコメント欄で将軍様がいぢわるなことばっかり言ってくるのでそれに対する返答を考えてみましょう。
かずくん将軍の、
ひよこも鳥であろう?では、おぬしのとんちとやらを使って、余の前で飛ばせてみせよ
と、シャノン将軍のこれ↓
ひよこはいずれ鶏になろう。ところで、鶏は短距離であれば飛べる。さて、鶏は鳥か否か? なれば、ひよこは最初は鳥ではなかったものが鳥になるとは如何に?
とんちの枠を大幅にはみ出しているぢゃないか!なんて思いながら考えてきました。まずはひよこについて!
Bird クラスは卵から孵ってひよこになって大人になる、なんてことしないしー。
もちろん、雛かどうかの状態を持った Bird クラスを実装することもできるでしょう。しかし、それは今回は必要ないことなのです。Bird
クラスは 鳥の飛ぶという振る舞いだけに着目して作ったクラスなのですから。将軍様もお人が悪い。
つづいて、鶏について!
っていうかー、あれで飛んでるとか、あたしは認めないしー。だから鳥ぢゃないしー。
私は鶏が飛べるということを否定します。なので私は今回においては鶏クラスは、Bird クラスを継承しません。このあたりはとても大切なことで、クラスを継承しようとする場合、その派生クラスは本当に基本クラスから派生していいのか、しっかり検討しなければいけません。
# すべては「いらんことを考えない」方向で片付けました♪