サーチ…


クラスの定義

クラスはOOPの重要な側面です。クラスはオブジェクトの "青写真"のようなものです。オブジェクトにはクラスのプロパティがありますが、その特性はクラス自体で定義されていません。それぞれのオブジェクトは異なる可能性があるため、独自の特性を定義します。

Public Class Person
End Class
 
Public Class Customer
End Class

クラスにはサブクラスも含めることができます。サブクラスは、その親クラスと同じプロパティおよびビヘイビアを継承しますが、独自のプロパティおよびクラスを持つことができます。

継承修飾子(クラス上)

継承する

ベース(または親)クラスを指定します。

Public Class Person
End Class

Public Class Customer
    Inherits Person

End Class

'One line notation
Public Class Student : Inherits Person
End Class

考えられるオブジェクト:

Dim p As New Person
Dim c As New Customer
Dim s As New Student

NotInheritable

プログラマがクラスを基本クラスとして使用できないようにします。

Public NotInheritable Class Person
End Class

考えられるオブジェクト:

Dim p As New Person

MustInherit

クラスを基本クラスとしてのみ使用することを指定します。 (抽象クラ​​ス)

Public MustInherit Class Person
End Class

Public Class Customer
    Inherits Person
End Class

考えられるオブジェクト:

Dim c As New Customer

継承修飾子(プロパティとメソッド)

オーバーライド可能

クラスのプロパティまたはメソッドを派生クラスでオーバーライドできるようにします。

Public Class Person
    Public Overridable Sub DoSomething()
        Console.WriteLine("Person")
    End Sub
End Class

オーバーライド

基本クラスで定義されているオーバーライド可能なプロパティまたはメソッドをオーバーライドします。

Public Class Customer
    Inherits Person

    'Base Class must be Overridable
    Public Overrides Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub
End Class

NotOverridable

継承するクラスでプロパティまたはメソッドがオーバーライドされないようにします。デフォルトの動作。 オーバーライドメソッドでのみ宣言できます

Public Class Person

    Public Overridable Sub DoSomething()
        Console.WriteLine("Person")
    End Sub

End Class

Public Class Customer
    Inherits Person

    Public NotOverridable Overrides Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub

End Class

Public Class DetailedCustomer
    Inherits Customer

    'DoSomething can't be overridden
End Class

使用例:

Dim p As New Person
p.DoSomething()

Dim c As New Customer
c.DoSomething()

Dim d As New DetailedCustomer
d.DoSomething()

出力:

Person
Customer
Customer

MustOverride

派生クラスがプロパティまたはメソッドをオーバーライドする必要があります。

MustOverrideメソッドは、 MustInheritクラスで宣言する必要があります

Public MustInherit Class Person

    Public MustOverride Sub DoSomething()
    'No method definition here

End Class

Public Class Customer
    Inherits Person

    'DoSomething must be overridden
    Public Overrides Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub

End Class

使用例:

Dim c As New Customer
c.DoSomething()

出力:

Customer

MyBase

MyBaseキーワードは、クラスの現在のインスタンスの基本クラスを参照するオブジェクト変数のように動作します。

Public Class Person
    Public Sub DoSomething()
        Console.WriteLine("Person")
    End Sub
End Class

Public Class Customer
    Inherits Person

    Public Sub DoSomethingElse()
        MyBase.DoSomething()
    End Sub

End Class

使用例:

Dim p As New Person
p.DoSomething()

Console.WriteLine("----")

Dim c As New Customer
c.DoSomething()
c.DoSomethingElse()

出力:

Person
----
Person
Person

私とMyClass

Meは現在のオブジェクトインスタンスを使用します。

MyClassは、メンバーが呼び出されたクラスのメンバー定義を使用します

Class Person
    Public Overridable Sub DoSomething()
        Console.WriteLine("Person")
    End Sub

    Public Sub useMe()
        Me.DoSomething()
    End Sub

    Public Sub useMyClass()
        MyClass.DoSomething()
    End Sub
End Class

Class Customer
    Inherits Person

    Public Overrides Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub
End Class

使用例:

Dim c As New Customer
c.useMe()
c.useMyClass()

出力:

Customer
Person

オーバーロード

オーバーロードとは、同じ名前で異なる引数型を持つクラス内に、複数のプロシージャ、インスタンスコンストラクタ、またはプロパティを作成することです。

Class Person
    Overloads Sub Display(ByVal theChar As Char)
        ' Add code that displays Char data.
    End Sub

    Overloads Sub Display(ByVal theInteger As Integer)
        ' Add code that displays Integer data.
    End Sub

    Overloads Sub Display(ByVal theDouble As Double)
        ' Add code that displays Double data.
    End Sub
End Class

上書きできないメンバーを再宣言します。インスタンスへの呼び出しだけが影響を受けます。基本クラス内のコードはこれによって影響を受けません。

Public Class Person
    Public Sub DoSomething()
        Console.WriteLine("Person")
    End Sub


    Public Sub UseMe()
        Me.DoSomething()
    End Sub
End Class
Public Class Customer
    Inherits Person
    Public Shadows Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub

End Class

使用例:

Dim p As New Person
Dim c As New Customer
p.UseMe()
c.UseMe()
Console.WriteLine("----")
p.DoSomething()
c.DoSomething()

出力:

Person
Person
----
Person
Customer

落とし穴

例1、ジェネリックで新しいオブジェクトを作成するどの機能が使用されますか?

Public Sub CreateAndDoSomething(Of T As {Person, New})()
    Dim obj As New T
    obj.DoSomething()
End Sub

使用例:

Dim p As New Person
p.DoSomething()
Dim s As New Student
s.DoSomething()
Console.WriteLine("----")
CreateAndDoSomething(Of Person)()
CreateAndDoSomething(Of Student)()

出力:直感的には、結果は同じでなければなりません。しかしそれは真実ではありません。

Person
Student
----
Person
Person

例2:

Dim p As Person
Dim s As New Student
p = s
p.DoSomething()
s.DoSomething()

出力:直感では、pとsが等しく、等しくなると考えることができます。しかしそれは真実ではありません。

Person
Student

この簡単な例では、Shadowsの奇妙な振る舞いを学ぶのは簡単です。しかし、実際には、それは驚きをたくさんもたらします。影の使用を防ぐことが望ましいです。可能な限り他の選択肢を使用する必要があります(上書きなど)。

インターフェイス

Public Interface IPerson
    Sub DoSomething()
End Interface

Public Class Customer
    Implements IPerson
    Public Sub DoSomething() Implements IPerson.DoSomething
        Console.WriteLine("Customer")
    End Sub

End Class


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow