継承」タグアーカイブ

VB.netのクラスで覚えたことを書いておく


VB.netのクラスで覚えたことを書いておく

インターフェース
よくわからないが、一言で言えば、派生クラスのオブジェクトをメソッドの引数として使える(意味があっているかわからないが)
だから、クラスのメソッドを派生クラスごとに作成する必要がなくなる。
ではどんな用途に向いているのか?
実際どんなときに使えるのかがよくわからない。
あまり使わないが使えると便利なのでできるだけ使うようにしておくと良いと思う。

・抽象クラスとは、基底クラスでオブジェクトは作れない。抽象メソッドがあると派生クラスもオブジェクトは作れない。
つまり、派生クラスで使用することが前提となる。
なので
オーバーライドする必要がある。

・継承について
コンストラクタ(Newメソッド)が派生クラスにある場合、派生クラスと基底クラスも実行されるので、注意が必要
例えば基本クラスのNewにプリント文があるとして、派生クラスのNewにもプリント文がある。
なんとなく、派生クラスのNewだけが実行されると思ってしまうが、結局全部実行される。これはコンストラクタだけの問題。
継承でもオーバーライドは使える。てっきり継承では使えず、抽象クラスで使うものかと思ってしまった。

基底クラスにOverridable 関数
派生クラスにOverrides 関数とする。
そうすると派生クラスで書いた関数が基底クラスの関数を上書きする

継承クラスの考え方は抽象クラスとほぼ同じなので、
抽象クラスを使いつつ、インターフェースとして活用できる道を考えてみる

文章で説明されてもすぐにイメージできないし理解できない。そうなると使えるようになるわけではないので、実際に実行して理解を深めるほかない。
動かしているうちになんとかわかってくるものである。
実際に使うときは、ほとんど継承の基本的な部分しか使いこなせない。
しかし、知識として知っていないとサンプルコードが読めなくなる。

事例
VB.netコンソールプロジェクトの例 実行はCtr+F5でコンソールが出力される。
実行だけではすぐに消える

Module Module1
‘VB.net 継承クラスと抽象クラスの書き方2018年12月22日勉強中
‘(1)継承クラス
‘ 書き方
‘ オーバーライドで基底クラスと派生クラスの宣言が異なる
‘ 基底クラス:オーバーライドはOverridable
‘  派生クラス:Inheritsを書いてオーバーライドOverrides
‘ コンストラクタnewはオーバーライドされないので基底クラスと派生クラスのコンストラクタNewが実行される
‘(2)抽象クラス

VB.net 2018年12月23日
Module Module1 ’コンソールアプリ
Sub Main()
    '抽象クラス
    Dim test As subCamera = New subCamera
    test.Release()
    Console.WriteLine(test.mainString)

    '継承Inherits
    Dim testKeisho As KeishoClass = New KeishoClass
    testKeisho.keishoFunc()
    testKeisho.OverTest() 'overrideした関数 
        '参照渡しと値渡しの勉強
        Console.Write("初期値")
        Dim i As Integer = 5

        Console.WriteLine(i)
        Dim sansho As SanshoClass = New SanshoClass
        sansho.sansho(i)
        Console.Write("参照:")
        Console.WriteLine(i)
        Console.Write("")
        Console.Write("初期化")
        i = 5
        Console.WriteLine(i)
        Console.Write("値渡し:")
        Console.WriteLine(i)
        sansho.atai(i)
        Console.Write("値渡しは値は変わらず")
        Console.WriteLine(i)
End Sub
End Module
 '抽象クラス
 MustInherit Class Camera
     Public mainString As String
     'mainString = "main" 'ここでは与えられない
     MustOverride Sub Release() 'オーバーライドされる。というか何もない
 End Class
 Class subCamera : Inherits Camera
     Overrides Sub Release()
         mainString = "main"
         Console.WriteLine("subCamera Release")
     End Sub End Class 
'継承クラス
Class NormalClass
    Public Sub New()
 'Inherits継承ではコンストラクタはオーバーライドされないことを知っておく。<br>
        Dim newClassString As String
        newClassString = "NewClassString"
        Console.WriteLine(newClassString)
    End Sub
  Overridable Sub OverTest() '一文字が大文字
     Console.WriteLine("overTest normal")
  End Sub
End Class
Class KeishoClass : Inherits NormalClass
    Public Sub New()
        'Inherits継承ではオーバーライドされないことを知っておく。
        'そのため親ClassのNewも実行されるので子Classでは差分を書くこと
        Dim keisho As String
        keisho = "keishoString"
        Console.WriteLine(keisho)
    End Sub
    Overrides Sub OverTest() '一文字が大文字 オーバーライドした
        Console.WriteLine("overTest overRide")
    End Sub
Public Sub keishoFunc()
    Console.WriteLine("keishoFunc")
End Sub
End Class
Class SanshoClass : Inherits NormalClass
    '参照渡しの勉強 C言語ならポインタとかアドレスを使ったけどVBなのでBYREF,とかBYVALになる
    Public Sub sansho(ByRef x As Integer)
        x = 10 '参照なので値が変わる
    End Sub
    '値渡しの勉強
    Public Sub atai(ByVal x As Integer)
        x = 10 '値渡しなので値は変わらない
    End Sub
End Class