たまに「じゃんぬねっと」が生存確認をする日記

役員より労働者の方が絶対楽だと思う

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  984  : 記事  4  : コメント  38442  : トラックバック  277

ニュース

My Website

初心者向けのサイトです。

C# と VB.NET の入門サイト

最近のできごと

低学歴の IT エンジニア兼管理職です。ずっとリモートワーク中。

駆け出しはブラック企業で低年収でしたが、転職を繰り返して年収は 5 倍以上になりました。

年収はこれ以上増えても幸せ指数は増えませんので、趣味の時間を増やすため早期の半リタイアを考えています。

最高の配偶者、可愛い娘、ハンサムな息子と幸せな日々を送っています。

息子の将来の夢はゲーム実況者らしい。がんばれー^^。

Sponsored Link1

Sponsored Link2

Archive

書庫

VB6.0 をある程度使いこなしている方はご存知かと思いますが、VB6.0 でもポリモーフィズム (多態性) を表現することができます。といっても、案外知られていないですし、まったく活用されていないと思います。少なくとも、他人のソースでお目にかかったことはありません。

とはいえ、ネタもないので説明だけしようと思います。

まず、単純な「動物」を示す IAnimal インターフェイスを定義します。プロジェクトにクラス モジュールを追加し、IAnimal というクラス名をつけ以下のように記述します。

VB6.0 - IAnimal インターフェイス

'/** ICry インターフェイス */
Option Explicit

' Cry 仮想メソッド
Public Sub Cry()

End Sub

これだけで完了です。「泣く」という動作を示す Cry メソッドは「仮想メソッド」になりますので、実装部分のコードの記述はありません。いわゆる空実装ということもあって、インターフェイスというよりは抽象クラスに近いイメージですね。プロパティ ウィンドウで指定したクラス モジュール名が「型」になります。

次に、IAnimal を実装したクラス モジュールを書きます。インターフェイスを実装するには、Implements キーワードをクラスの先頭に記述します。ここでは、身近な動物として Dog (犬) クラスと Cat (猫) クラスとしました。

VB6.0 - Dog クラス

'/** Dog クラス */
Option Explicit

' IAnimal インターフェイスを実装していることを定義します
Implements IAnimal

' IAnimal.Cry メソッドの実装
Private Sub IAnimal_Cry()
    Call MsgBox("ワン! ワン!")
End Sub

VB6.0 - Cat クラス

'/** Cat クラス */
Option Explicit

' IAnimal インターフェイスを実装していることを定義します
Implements IAnimal

' IAnimal.Cry メソッドの実装
Private Sub IAnimal_Cry()
    Call MsgBox("にゃーん")
End Sub

Dog クラスおよび、Cat クラスは、IAnimal インターフェイスを実装するので Cry メソッドの実装が必須となります。VB6.0 では、[インターフェイス名]_[メソッド名] という名前で識別しているので、今回は IAnimal_Cry という名前のメソッドが必要になるということです。

このメソッドのアクセシビリティが Private であることに着目してください。これでは外部から呼び出せないですね。というより、呼び出せないようにしました。といっても、この「具象化したクラスの型」からは呼び出せないだけです。インターフェイスの型からは呼び出すことができます。

実際に「インターフェイスの型」からこの Cry メソッドを呼び出してみましょう。適当なところで、以下のように記述します。

VB6.0 - IAnimal インターフェイスから Cry メソッドを呼び出す

'/** テスト用のモジュールか何か */
Option Explicit

' テスト用の MosaMosaAA メソッド
Private Sub MosaMosaAA()
    Dim oneDog As IAnimal
    Set oneDog = New Dog
    Call oneDog.Cry()

    Dim oneCat As IAnimal
    Set oneCat = New Cat
    Call oneCat.Cry()
End Sub

実行結果として、メッセージ ボックスに「ワン! ワン!」と「にゃーん」が出力されます。

Dog クラス、または Cat クラスの Cry メソッドは Private になっていますが、IAnimal 型から間接的に呼び出されているため問題なく実行されます。oneDog も oneCat も型は IAnimal ですが、Cry メソッドを呼び出すとそれぞれ別の動作をしました。一般的には、これを「ポリモーフィズム (多態性)」と呼んでいます。

別の動作をするのは、IAnimal 型という変数の入れ物に入ったデータが、実際には Dog 型だったり、Cat 型だったりするからです。変数という入れ物の型とは別に、それに格納されているデータの型について意識する必要があります。

変数の入れ物の型はデータの型と一致していないため曖昧になりますが、この型からメソッド (メンバ) を呼び出したとしても「遅延バインディング」にはなりません。確かにインターフェイスによる抽象化は、メソッドの具体的な振る舞いは曖昧になっています。しかし、どのメンバが実装されているかは明示化されているため、コンパイル解決できるのです。

では、どういった時に活用すれば良いのでしょうか? 私の場合は、印刷処理をそれなりにフレームワーク化したい時に使いました。印刷するためにはデータを集める必要があるのですが、印刷する処理によって集めるべきデータが全然違います。しかし、印刷処理を記述する部分は冗長がないようにしたい。分岐すれば良いだけのことだが、呼び出し元ではそんなことは意識させたくない。そんな時に使用しました。あとは、データクラスを作ってそのデータを実際のデータベースに更新したい時にも使いましたね。

投稿日時 : 2007年4月9日 10:20

コメント

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/09 10:54 とりこびと
>変数という入れ物の型とは別に、それに格納されているデータの型について意識する必要があります。

実のところ、このあたりで足を止めた覚えがあります。分かってしまえば、何てことないのでしょうけど。(すみません、VB6.0ではないのですが。)
このあたりが分かってくると楽しさ倍増なんでしょうねぇ♪

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/09 11:28 まどか
> このあたりが分かってくると楽しさ倍増なんでしょうねぇ♪

VB6では逆でしたね。。。
面倒という印象しかありません。#そう思うのも理解していてこそだったりしますが。

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/09 11:31 じゃんぬねっと
まあ、正直なところ活用できる業務が少ないとは思いますね。
データ クラスとかという考え方する人も少ないですから。
(== 何でもかんでも Type 使う人の方が多い)

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/09 11:32 シャノン
> 変数という入れ物の型とは別に、それに格納されているデータの型について意識する必要があります。

これは、「普段は変数の型と中身の型が違うことをを意識していないVB6.0プログラマは~」という文が頭につくんですよね。
というか、意識すべきものは中身の型ではなく、「中身の型は変数の型と違う可能性」ですよね。
多態性に慣れてくると(変数の型と中身の型が違う可能性を当然のように思えてくると)、逆に「中身の型が何であるか」は意識しないから使いやすいわけですが。

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/09 11:34 シャノン
VB6 のクラスは、ActiveX コントロール、要するに COM クラスを作るためのものでしたからね。
COM インターフェイスを作ることが主目的だったみたいですから。

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/09 11:55 じゃんぬねっと
> という文が頭につくんですよね。

相変わらず、シャノンさんはストレートですねw

> というか、意識すべきものは中身の型ではなく、「中身の型は変数の型と違う可能性」ですよね。

それと同じことが言いたかったのですが、最初に変数の箱という説明が欲しかったのです。
別物であるという考えを持っていない人からすると、まずはこういう説明が必要かなと思いまして。

> 逆に「中身の型が何であるか」は意識しないから使いやすいわけですが。

利用者側からすれば、そうなると思います。
もともとポリモーフィズムという概念が目指しているところはそこですから。
(でなければ、ただ可読性を悪くしているだけになってしまう)

ただ、提供する側の立場はそのあたりを意識しないと、"作ること自体ができない" ので説明しました。
書くだけならできそうですが、概念を理解しないと真っ当なものが作れないと思いまして。

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/09 11:56 じゃんぬねっと
> VB6 のクラスは、ActiveX コントロール、
> 要するに COM クラスを作るためのものでしたからね。
> COM インターフェイスを作ることが主目的だったみたいですから。

そうでしょうね。取ってつけた機能が多いと感じます。
いや、ありがたく使わせてもらってますけどね。

クラス モジュールは、VB4 からユーザーに提供されたものですよね。
(まだ、私もシャノンさんも中学生の頃ですねw)

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/09 14:45 シャノン
> (まだ、私もシャノンさんも中学生の頃ですねw)

…ギリギリ小学生w

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/10 10:12 じゃんぬねっと
あ、1995 年だから小学生になっちゃいますね。
VB4 の発売日って、もっと後だと思っていました。

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/10 10:50 backdoor
>1995 年だから小学生になっちゃいますね。

・・・小学生、うちの子と一緒・・・。 orz

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/10 10:51 じゃんぬねっと
backdoor さん、年齢がバレそうな発言乙ですw

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/21 15:22 R・田中一郎
できることは知っていたのですが、使ったことがありませんでした。
今 VB6 案件、細いのやっていて飽きてきたので、早速使ってみるテスト。

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/21 16:39 R・田中一郎
べっ、便利!(T-T)

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/21 16:50 R・田中一郎
しかもっ!
抽象化もできるらしいです。
http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/08/13/12756.aspx
うずうずうずうず。

# re: VB6.0 でポリモーフィズム (多態性) 2007/04/21 19:12 じゃんぬねっと
はい、知っていますよ。

# nmfVpcYLGWWEy 2021/07/03 4:34 https://www.blogger.com/profile/060647091882378654
Therefore that as why this piece of writing is perfect. Thanks!

# re: VB6.0 ????????? (???) 2021/07/14 2:51 when was hydroxychloroquine first used
does chloroquine work https://chloroquineorigin.com/# plaquenil 200 mg twice a day

# re: VB6.0 ????????? (???) 2021/07/24 12:04 hydroxychloroquine tablet
chloroquinolone malaria https://chloroquineorigin.com/# hydroxychlorquine

# re: VB6.0 ????????? (???) 2021/08/07 19:43 hydroxychloroq
who chloroquine https://chloroquineorigin.com/# what is hydroxychloroquine sulfate

# re7mgqj 2021/11/17 11:29 bahamut1001
http://www.pa3hu.com/space-uid-114238.html

# qvxoewvpqqta 2021/11/28 3:41 cegohpis
chloriquine https://chloroquine500mg.com/

# YZEMQHoAGLgywiC 2022/04/19 14:03 johnanz
http://imrdsoacha.gov.co/silvitra-120mg-qrms

# purchase plaquenil online 2022/12/26 23:49 MorrisReaks
aralen online cheap http://www.hydroxychloroquinex.com/#

# doors2.txt;1 2023/03/14 15:04 TXYxzvmPbxc
doors2.txt;1

Post Feedback

タイトル
名前
Url:
コメント: