Visual StudioのVB.Netプロジェクトに新しいファイルを追加すると、「クラス」と「モジュール」の両方のオプションが表示されます。クラスは次のように記述されます
An empty class file
モジュールは
A file for storing groups of functions
クラスは関数のグループなどを格納できるため、これはモジュールがクラスほど有用ではないことを意味しているようです。
モジュールが単なる関数のグループである場合ですか、それともVisual Studioのドキュメントが示唆する以上のモジュールがあるのですか?
classはタイプです。この型を他の型(String
、Integer
、Date
、FileInfo
...)と同様に使用して、変数、パラメーター、プロパティ、関数を宣言できます。戻り型。
小さな例を作ってみましょう:
_Public Class Person
Public Property FirstName As String
Public Property LastName As String
Public Overridable Sub Print() 'I'll explain Overridable later.
Console.WriteLine("{0} {1}", FirstName, LastName)
End Sub
End Class
_
これで、タイプPerson
の変数を宣言できます
_Dim sue, pete As Person
Dim persons As List(Of Person)
sue = New Person()
sue.FirstName = "Susan"
sue.LastName = "Miller"
pete = New Person()
pete.FirstName = "Peter"
pete.LastName = "Smith"
persons = new List(Of Person)()
persons.Add(sue)
persons.Add(pete)
For Each person As Person In persons
person.Print()
Next
_
modulesは静的です。つまりモジュールに格納されたデータは1度だけ存在します。一方、New
を使用してモジュールをインスタンス化する必要はないため、グローバルデータを格納したり、グローバルに利用できるメソッドに使用したりすることがよくあります。たとえば、人のリストをモジュールに保存できます。
しかし、クラスでできることはもっとたくさんあります。基本クラスからクラスを派生させることができます。この新しいクラスは、基本クラスからすべてを継承し、さらにクラスを追加できます。たとえば、Employee
からPerson
クラスを派生させることができます
_Public Class Employee
Inherits Person
Public Property Salary As Decimal
Public Overrides Sub Print
Console.WriteLine("{0} {1}, Salary = {2}", FirstName, LastName, Salary)
End Sub
End Class
_
_Person.Print
_のOverridable
キーワードを使用すると、派生クラスでPrint
メソッドを再定義(オーバーライド)できます。 (クラスの関数とSubはメソッドと呼ばれます。)
従業員は個人に割り当て互換性があります。 persons
リストに従業員を追加できます。これは、For Eachループを変更する必要はありません。つまり、person.Print()
を呼び出すと、自動的に適切なPrint
メソッドが呼び出されます(最初のメソッドは「通常の」人用、2番目のメソッドは従業員用) )。
_Dim emp as Employee
emp = New Employee()
emp.FirstName = "Frank"
emp.LastName = "Taggart"
emp.Salary = 3500.00D
persons.Add(emp)
_
クラスについて言うことはもっとたくさんあります。クラスで何ができるか、ある程度理解していただけたでしょうか。
Visual Basicのオブジェクトとクラス 、特にセクション クラスとモジュールの違い を参照してください。
クラスはユニットのようなものであり、モジュールは基本的には関数、変数、クラスなどの緩いものの集まりです。
パブリックモジュールでは、プロジェクトのクラスはモジュールの関数と変数にアクセスできます。対処するためにモジュール名を指定する必要はありません。モジュールにクラスを含めることもできます。
クラスの変数と関数は、クラスによってより厳密な「所有権」の下にあります。他のクラスで使用されるパブリック変数および関数(メソッド)は、クラス名で使用されます:classname.method
、モジュールのそれらとは異なり。
モジュールのインスタンスは1つしかありませんが、クラスの1つ以上のインスタンスを同時に使用できます。
モジュールは、静的クラスの別名にすぎません。
これですべてです。
信じられない場合は、VB.NETでモジュールをコンパイルし、C-Sharpを使用してILSpyで逆コンパイルしてください。
そして、はい、それはあなたが正しいということを意味します。機能に関しては、モジュールはクラスのサブセットです。
したがって、クラスは機能の点ではモジュールのSUPERsetです。これは、静的および非静的メソッドと変数、および仮想と保護されたアクセス修飾子を含むことができるためです。
クラスとモジュールの主な違いは、クラスはオブジェクトとしてインスタンス化できるが、標準モジュールはインスタンス化できないことです。標準モジュールのデータのコピーは1つしかないため、プログラムの一部が標準モジュールのパブリック変数を変更すると、プログラムの他の部分がその変数を読み取ると、同じ値が取得されます。対照的に、オブジェクトデータは、インスタンス化されたオブジェクトごとに個別に存在します。もう1つの違いは、標準モジュールとは異なり、クラスがインターフェースを実装できることです。
ソース: http://msdn.Microsoft.com/en-us/library/7825002w(en-US、VS.80).aspx
実際には、クラスを使用してオブジェクトを作成します。たとえば、次の.NETコンソールアプリケーションでは、r
はRectangle
オブジェクトです。
Imports System
Public Class Rectangle
Private length As Double
Private width As Double
'Public methods
Public Sub AcceptDetails()
length = 4.5
width = 3.5
End Sub
Public Function GetArea() As Double
GetArea = length * width
End Function
Public Sub Display()
Console.WriteLine("Length: {0}", length)
Console.WriteLine("Width: {0}", width)
Console.WriteLine("Area: {0}", GetArea())
End Sub
Shared Sub Main()
Dim r As New Rectangle()
r.Acceptdetails()
r.Display()
Console.ReadLine()
End Sub
End Class