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