まとまりのないブログ

something which something is something

vb.net

継承と実装

投稿日:

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

-vb.net

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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

関連記事

no image

datagridの列幅の調整ができない

こんなことで嵌るのは私くらいかもしれないけれど一応備忘録 datagridviewのプロパティにある、AllowUserToResizeColumnsの値をtrueに設定しても、実際にデータをバインド …

no image

メモ

現在改良中の家計簿ソフトのデータモデルを変更するかどうかについてのメモ。今のところはmicrosoftのaccessのjetという名前のデータベースでデータを管理している。作る前まではデータを保存する …

no image

リッチテキストボックスに左余白を設定する

備忘。右画像のようにテキストボックス内に左余白を設定する。リッチテキストボックスのプロパティパネル内を見渡しても左余白を設定するプロパティは見つからなかった。右余白については、RightMarginと …

no image

MonthCalendarの表示がxpとvistaでサイズが異なる

visual studio 2005のwindowsアプリケーションを作成する場合に使うコントロールの一つにMonthCalendarというのがある。これをフォーム内に配置して表示確認を行ったところ、 …

no image

datagridviewのcellselectの挙動

monthcalendarコントロールの表示が環境によって大幅に変わるため、datagridviewでカレンダーを自作したときにcellselectの挙動がどうもおかしかったのでメモ。datagrid …