エクセルVBA オブジェクト指向備忘録 java 継承(具象・抽象・インターフェース)

20241228エクセルVBA オブジェクト指向備忘録 java 継承(具象・抽象・インターフェース)


<前書き>
エクセルVBAオブジェクト指向、初心者です。
VBA自体は、以前から使用していました。
オブジェクト指向というものがあることは、知っていましたが、ネットなどを見てもよく分からず、挫折した過去あり。
<以上前書き>

(素人なので間違っているかもしれません。汗。)

タイトルにjavaと入っていますが、javaは分かりません。
ユーチューブの「猫でもわかるプログラミング入門」を見させていただきました。
感謝します。その備忘録メモです。
不都合があれば、削除いたします。

javaには、継承の概念があり、方法もいろいろあるようです。
他方VBAには、継承の概念(抽象-具体)がないのですが、上記ユーチューブのjavaの継承を覚えておく(メモしておく)と、
VBAオブジェクト指向のコーディング(整理)にも役立つ気がしました。


(注:自分用のメモなので、間違い・勘違い多数あります。)


javaの継承1(種類)
<具象クラス>
public class cat(){

    public string name= ~ ";
    public int age=0;

    public cry(){
        system.out.println("ニャー")
    }
}
/////////////特徴は具象メソッドを実装していること
(メモ:これって継承なん?と思う)


javaの継承2(種類)
<抽象クラス>
public abstract class animal(){
    private string kind ="";
    public void cry();          //抽象メソッド空実装(必須)
    public string getkind(){    //具象メソッド実装
        return this.kind;
    }

}
//////////////////////特徴は具象入っていい(混在)

javaの継承3(種類)
<インターフェース>
public interface price(){
    public int getprice(int kind,int age);        //抽象メソッド(空実装)

}


//////////////////////特徴は抽象メソッドだけ。(定義のみで{}はなし。)抽象メソッドも置かず、フィールド変数のみもある。
インターフェースは拡張子が、.javaでなく、.interfaceのようです。

====================================================
javaの継承1(継承の仕方)
<具象クラス>

class mike extends cata(){

}
//////////////////////特徴は一つのみ継承可能
(メモ:基底クラスのcatに具象メソッドあるからこれでいいんだな・・・。
extendsで上から引っ張ってくるイメージか。なんか複数形extendsだけど1個のクラスしか継承できない。)

 

javaの継承2(継承の仕方)
<抽象クラス>


public class dog extends animal(){

    @override
    public void cry(){   //子クラスで実装
        system.out.println("ワン")
    }
}

animalの抽象メソッドを実装(抽象メソッドを実装)

//////////////////////特徴は一つしか継承できない。継承した際に、未実装だとエラーになり、エラー解消のため@overrideを付ける。
(メモ:abstractクラスに未実装があったら、継承先クラスで実装が必要。そのために、@overrideを記載。
extendsしてるけど、未実装があれば、継承先で、実装が必要(当たり前)。オーバーライドで、優先させる感じか・・・。
javaはエラーで教えてくれるんだ・・・。)

 

javaの継承3(継承の仕方)
<インターフェース>
public class mouse implements  price, habitat(){

    @override     //未実装を実装
    public int getprice(string kind, int age){
        system.out.println("茶色 生まれたて 1000円")

    }
    @override
    public void getarea(){
        system.out.println("日本")    
    }
}
//////////////////////特徴は複数のインターフェースを継承。implementsの後にカンマでつなげる。
==========================


javaの継承1(子クラスから親の呼び出し)
<具象クラス>


cat mike = new mike();    //抽象度高いクラスを前に 低い方を後ろに書く
mike.cry()


//////////////////////特徴はフィールド変数やメソッド使える


javaの継承2(子クラスから親の呼び出し)
<抽象クラス>

animal dog = new dog();
dog.cry();


//////////////////////特徴は子クラスで実装したメソッドが使える(@override)。

もう1個。
animal dog = new dog();
system.out.println(dog.kind)

//////////////////////特徴は親クラスで定義してあるフィールド変数やメソッドも使える。
(animalの方を持ってこれる。)

 


javaの継承3(子クラスから親の呼び出し)
<インターフェース>

mouse mouse = new mouse();
mouse.getprice("茶色,0");   //二番目の引数なし(0)
mouse.getarea();


//////////////////////特徴は子クラスで実装されたように処理される。
(メモ:インターフェースは、親は空実装なので、こんな感じになる。
mouse mouseと書くのが違和感ある気もするが、mouse(前)というインターフェースのクラスを継承したmouse(後)というインスタンスを作成ということだろう。


==============================================
メモ:
当たり前だが、オブジェクト指向でコーディングするには、クラスと呼び出しが必要。
で、無駄を省くために、継承を使う。
継承には、抽象度の高いクラス、低いクラスがある。

 

//////////////////////////
ユーチューブの最後に、上記の抽象クラスとインターフェースを使ったクラスが出ていた。

public class cat extends animal implements price,habitat(){


}


public class mike extends cat(){


}

//////////////////////////抽象クラスの継承は、1個しかできないので、animalを1個継承。
インターフェースは複数継承できるので、price,habitatを継承したcatクラスを作成。
そのcatクラスを継承するmikeクラスを作成。

メモ:
多重継承というらしい。
自分だと、animal mike = new animal()としてしまう。

ここで、catレベルのクラス、ドッグやマウスを作ればいろいろできるんだなあ。


その他メモ:
最後にクラス図が出ていて、→の方向が、下位クラスから上位クラス方向の矢印だった。「下から上に見てる」感じの書き方なのかな。
(インターフェースについても、同じだが、点線矢印で書いてありました。)

===========================================
上記で勉強したことを簡単に、以下にVBAで書いてあります。chatGPT4o様に感謝。(少し修正あり)


' Animal.cls
Option Explicit

Private pClassification As String

' プロパティ: 分類
Public Property Get Classification() As String
    Classification = pClassification
End Property

Public Property Let Classification(ByVal value As String)
    pClassification = value
End Property

' メソッド: 鳴く(空実装)
Public Sub Cry()
    ' 空実装(子クラスでオーバーライド)
End Sub


' Cat.cls
Option Explicit

Private pName As String
Private pAge As Integer
Private pBreed As String
Private AnimalInstance As Animal

' コンストラク
Private Sub Class_Initialize()
    Set AnimalInstance = New Animal
    AnimalInstance.Classification = "哺乳類"
End Sub

' プロパティ: 名前
Public Property Get Name() As String
    Name = pName
End Property

Public Property Let Name(ByVal value As String)
    pName = value
End Property

' プロパティ: 年齢
Public Property Get Age() As Integer
    Age = pAge
End Property

Public Property Let Age(ByVal value As Integer)
    pAge = value
End Property

' プロパティ: 種類
Public Property Get Breed() As String
    Breed = pBreed
End Property

Public Property Let Breed(ByVal value As String)
    pBreed = value
End Property

' プロパティ: 動物の分類
Public Property Get Classification() As String
    Classification = AnimalInstance.Classification
End Property

' メソッド: 鳴く
Public Sub Cry()
    Debug.Print "ニャー"
End Sub


' Mikeneko.cls
Option Explicit

Private CatInstance As Cat

' コンストラク
Private Sub Class_Initialize()
    Set CatInstance = New Cat
End Sub

' プロパティ: 名前
Public Property Get Name() As String
    Name = CatInstance.Name
End Property

Public Property Let Name(ByVal value As String)
    CatInstance.Name = value
End Property

' プロパティ: 年齢
Public Property Get Age() As Integer
    Age = CatInstance.Age
End Property

Public Property Let Age(ByVal value As Integer)
    CatInstance.Age = value
End Property

' プロパティ: 種類
Public Property Get Breed() As String
    Breed = CatInstance.Breed
End Property

Public Property Let Breed(ByVal value As String)
    CatInstance.Breed = value
End Property

' プロパティ: 動物の分類
Public Property Get Classification() As String
    Classification = CatInstance.Classification
End Property

' メソッド: 鳴く
Public Sub Cry()
    CatInstance.Cry
End Sub


Sub TestMikeneko()
    ' ミケをインスタンス
    Dim mikeneko As Mikeneko
    Set mikeneko = New Mikeneko

    ' ① ミケを鳴かせる
    Debug.Print "① ミケの鳴き声:"
    mikeneko.Cry

    ' ② 名前を「ミケ」に設定
    mikeneko.Name = "ミケ"

    ' ③ 年齢を「2」に設定
    mikeneko.Age = 2

    ' ④ 種類を「三毛猫」に設定
    mikeneko.Breed = "三毛猫"

    ' 結果を出力
    Debug.Print "② 名前: " & mikeneko.Name
    Debug.Print "③ 年齢: " & mikeneko.Age
    Debug.Print "④ 種類: " & mikeneko.Breed
    Debug.Print "動物の分類: " & mikeneko.Classification
End Sub