用語がどうもごちゃごちゃしていて頭に入ってきにくい。解説する人によって捉え方が違っていたりするのが原因ではあるのだろうけれど。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」という風に脳内変換をして気にしないようにする。