Visual Basicでは、Interfaceキーワードを使用してインターフェースを宣言します。インターフェースは、それを実装するクラスで実装されるべきメソッドのセットを定義します。
特徴:
コード例:
Interface ILogger Sub Log(message As String) End Interface Interface IErrorNotifier Sub NotifyError(errorMsg As String) End Interface Public Class FileLogger Implements ILogger, IErrorNotifier Public Sub Log(message As String) Implements ILogger.Log ' ロギングの実装 End Sub Public Sub NotifyError(errorMsg As String) Implements IErrorNotifier.NotifyError ' エラー通知の実装 End Sub End Class
同じ名前のメソッドが異なるシグネチャで宣言されている場合、二つのインターフェースを実装できますか?そのようなクラスはコンパイルされますか?
回答: はい、同様のインターフェースを二つ実装することは可能です。シグネチャが一致しない場合、コンパイラはそれぞれのメソッドの明示的な実装を要求します。明確性を保つために、実装時にはインターフェースの完全な名前を使用してください:
Public Class Example Implements IFirst, ISecond Public Sub DoWork() Implements IFirst.DoWork ' IFirst用の実装 End Sub Public Sub DoWork(value As Integer) Implements ISecond.DoWork ' ISecond用の実装 End Sub End Class
ストーリー
インターフェースの不完全な実装による機能の喪失: 開発者が宣言されたインターフェースの全ての要素を実装しなかったため、完全に実装された契約を期待するコレクションにクラスを追加した際に、暗黙的なエラーが発生し、実行時エラーにつながった。
ストーリー
複数インターフェースの実装によるメソッドの競合: プロジェクトで同名のメソッドを持つインターフェースを実装する必要がありました。明示的な実装がないため、メソッドは「互いに上書き」され、受け手はバージョンの一つしか受け取らず、ロジックの不正な動作に繋がりました。
ストーリー
責任の分離原則の違反: 大規模なプロジェクトで多くのインターフェースを1つのクラスが実装しており、コードの複製が原因であり、契約の実装を追跡し、インターフェース間の互換性を維持するのが困難でした。