用語がどうもごちゃごちゃしていて頭に入ってきにくい。解説する人によって捉え方が違っていたりするのが原因ではあるのだろうけれど。vb.netにおける継承と実装について。
- 継承 : inherits
- 実装 : implements
継承 : inherits
継承とは文字通り受け継ぐ。クラスAとクラスBがあったとして,クラスBがクラスAを継承したものだとすれば,クラスBはクラスAが持つメソッドを利用することができる。
Public Class ClassA Public Sub TestA() MsgBox("ClassA's Method") End Sub End Class Public Class ClassB Inherits ClassA Public Sub TestB() MsgBox("ClassB's Method") End Sub End Class Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim cA As New ClassA() Dim cB As New ClassB() cA.TestA() cB.TestA() cB.TestB() End Sub
実装 : implements
実装するとは,実装元の制約を守り要件を満たすこと,といってみる。vb.netではインターフェースという方法で実装を実現する。インターフェースはクラスの定義をした設計図のようなものであり,そのインターフェースを実装するクラスは設計図の要件を満たすように実装する。下記にサンプルを示すと,InterfaceAを実装するClassBは,InterfaceAに定義されているメソッドTestA()とTestB()を実装しなければならない。
Interface InterfaceA Function TestA() As String Function TestB() As String End Interface Public Class ClassB Implements InterfaceA Public Function TestA() As String Implements InterfaceA.TestA Dim str As String = "TestA's implements" Return str End Function Public Function TestB() As String Implements InterfaceA.TestB Dim str As String = "TestB's implements" Return str End Function End Class
C#
ちなみに,C#の場合は下記のようになる模様(機械変換なので厳密に正確かどうかは不明)
C# : 継承
public class ClassA { public void TestA() { Interaction.MsgBox("ClassA's Method"); } } public class ClassB : ClassA { public void TestB() { Interaction.MsgBox("ClassB's Method"); } } private void Form1_Load(object sender, System.EventArgs e) { ClassA cA = new ClassA(); ClassB cB = new ClassB(); cA.TestA(); cB.TestA(); cB.TestB(); }
C# : 実装
interface InterfaceA { string TestA(); string TestB(); } public class ClassB : InterfaceA { public string TestA() { string str = "TestA's implements"; return str; } public string TestB() { string str = "TestB's implements"; return str; } }
所感
C#の場合,クラスだけをみると継承なのか実装なのかはパッと見よくわからない。この辺りが人によって説明がわかれる原因になっているのかもしれない。あと,一般的に「実装」とは言わないらしく,言っても実装という言葉が多義的なので意味をわかってもらえない。言うとすれば,「インターフェースの実装」といったところ。
上のサンプルを一般的に言うと,
- 継承の部分で言うと,「ClassBはClassAを継承している」と言う。
- 実装の部分で言うと,「ClassBはInterfaceAを実装している」と言う。
となる。細かい話だけれども,存外に重要。
研究
インターフェースを継承したインターフェースを実装
Interface InterfaceA Function testA() As String Function testB() As String End Interface Interface InterfaceB Inherits InterfaceA Function testC() As String Function testD() As String End Interface Class ClassC Implements InterfaceB Public Function testA() As String Implements InterfaceA.testA Dim str As String = "TestA's implements" Return str End Function Public Function testB() As String Implements InterfaceA.testB Dim str As String = "TestB's implements" Return str End Function Public Function testC() As String Implements InterfaceB.testC Dim str As String = "TestC's implements" Return str End Function Public Function testD() As String Implements InterfaceB.testD Dim str As String = "TestD's implements" Return str End Function End Class
Javaにおける継承
Javaではクラスの継承を下記のようにextendsというキーワードによって行う。
class ClassA { public String testA(){ String str = "classA's Method"; return str; } } class ClassB extends ClassA { public String testB(){ String str = "classB's Method"; return str; } } public class Test { public static void main(String[] args) { ClassA cA = new ClassA(); ClassB cB = new ClassB(); System.out.println(cA.testA()); System.out.println(cB.testA()); System.out.println(cB.testB()); } }
extendsだと意味的には「拡張」という言葉がしっくりくるが,オブジェクト指向的にはやっていることは「継承」なので,Javaの「ClassAをextendsしたClassB」 = vb.netの「ClassAをinheritsしたClassB」という風に脳内変換をして気にしないようにする。