継承と実装

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

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)