1. ねらい
オブジェクト指向の応用として抽象クラスとインターフェースについて学ぶことです。
プログラムの拡張性や保守性を高める設計手法をとりいれましょう
2. サンプルプログラムの紹介
VB.NETを使用して、抽象クラスとインターフェースの違いや使い方を解説
日時の変換処理を行うプログラムを題材とする
サンプルプログラムの概要
- 入力された日時を異なるフォーマットで変換
- UTC、JST、和暦などの変換に対応
3. ファイル構成
以下がプログラムのファイル構成です:
-
FrmMain.vb
- メインフォームのイベント処理を記述 -
UtcToJstConverter.vb
- UTCをJSTに変換するクラス -
JstToUtcConverter.vb
- JSTをUTCに変換するクラス -
ToGgyyConverter.vb
- 和暦変換クラス -
IDateConverter.vb
- 日時変換用インターフェース -
BaseDateConverter.vb
- 基本の抽象クラス
4. 動作を確認
プログラムでは以下の動作が確認できます:
- 各ボタンをクリックすると、入力された日時が指定の形式に変換され、結果が表示されます。
- 結果はクリップボードに自動的にコピーされます。
例:
- 「UTC to JST」をクリックすると、UTCからJSTへの変換が行われます。
5. 抽象クラスとは
抽象クラスは、インスタンス化できないクラスで、継承されることを前提としています。
共通の処理やインターフェースを提供し、具象クラスが具体的な処理を実装します。
特徴:
- 抽象クラスは具象クラスが持つ共通の処理を提供する
- 具象クラスは抽象クラスを継承し、特定のメソッドを実装する必要がある
-
MustInherit
キーワードを使って定義
例:
Public MustInherit Class BaseDateConverter
Implements IDateConverter
Public MustOverride Function ConvertDate(inputDate As String) As String
Protected Function InvalidDateMessage() As String
Return "日時が不正です。"
End Function
End Class
6. インターフェースとは
インターフェースは、クラスに対して必ず実装すべきメソッドやプロパティを定義します。
実装そのものは提供せず、複数のクラスに共通の機能を持たせたいときに使用します。
特徴:
- 複数のクラスに共通の振る舞いを定義する
- クラスがインターフェースを実装する場合、定義されたすべてのメソッドを実装しなければならない
-
I
で始まる名前をつけるのが一般的
例:
Public Interface IDateConverter
Function ConvertDate(inputDate As String) As String
End Interface
7. メインフォームの説明
FrmMain.vb
では、各ボタンのクリックイベントに対して、対応する日時変換処理を呼び出しています。
ConvertDateWithConverter
メソッドを使って、統一的に処理を行い、結果を表示し、クリップボードにコピーします。
Private Sub ConvertDateWithConverter(converter As IDateConverter)
txtResult.Text = converter.ConvertDate(txtInput.Text)
Clipboard.SetText(txtResult.Text)
End Sub
ボタンイベント例:
Private Sub BtnToJST_Click(sender As Object, e As EventArgs) Handles btnToJST.Click
Dim converter As IDateConverter = New UtcToJstConverter()
ConvertDateWithConverter(converter)
End Sub
8. インターフェースと抽象クラスの違い
インターフェースの特徴
- 実装すべきメソッドやプロパティの仕様を定義
- 複数のクラスに共通の機能を持たせたいときに使用
- クラスに複数のインターフェースを実装可能
抽象クラスの特徴
- 継承されることを前提とし、共通の処理をまとめる
- 具体的な処理と抽象的な処理を組み合わせて定義可能
- 一部のメソッドは具体的に実装し、一部は継承クラスで実装
使い分けの基準
- インターフェース: 複数のクラス間で共通の振る舞いを定義する場合
- 抽象クラス: 共通のロジックをまとめ、サブクラスで実装を補完する場合
9. 可視化
以下は、インターフェースと抽象クラスの関係を可視化した図です。
10. まとめ
- 抽象クラスは共通の処理をまとめ、クラス間でロジックを再利用できる
- インターフェースは共通の仕様を定義し、異なるクラスで同様のメソッドを強制的に実装させることができる
- 適切な設計手法を選ぶことで、プログラムの拡張性と保守性が向上します