web-dev-qa-db-ja.com

モジュールとクラスの違いは何ですか?

Visual StudioのVB.Netプロジェクトに新しいファイルを追加すると、「クラス」と「モジュール」の両方のオプションが表示されます。クラスは次のように記述されます

An empty class file

モジュールは

A file for storing groups of functions

クラスは関数のグループなどを格納できるため、これはモジュールがクラスほど有用ではないことを意味しているようです。

モジュールが単なる関数のグループである場合ですか、それともVisual Studioのドキュメントが示唆する以上のモジュールがあるのですか?

15
Stephen

classはタイプです。この型を他の型(StringIntegerDateFileInfo ...)と同様に使用して、変数、パラメーター、プロパティ、関数を宣言できます。戻り型。

小さな例を作ってみましょう:

_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つ以上のインスタンスを同時に使用できます。

6
xpda

モジュールは、静的クラスの別名にすぎません。
これですべてです。
信じられない場合は、VB.NETでモジュールをコンパイルし、C-Sharpを使用してILSpyで逆コンパイルしてください。

そして、はい、それはあなたが正しいということを意味します。機能に関しては、モジュールはクラスのサブセットです。
したがって、クラスは機能の点ではモジュールのSUPERsetです。これは、静的および非静的メソッドと変数、および仮想と保護されたアクセス修飾子を含むことができるためです。

6
Stefan Steiger

クラスとモジュールの主な違いは、クラスはオブジェクトとしてインスタンス化できるが、標準モジュールはインスタンス化できないことです。標準モジュールのデータのコピーは1つしかないため、プログラムの一部が標準モジュールのパブリック変数を変更すると、プログラムの他の部分がその変数を読み取ると、同じ値が取得されます。対照的に、オブジェクトデータは、インスタンス化されたオブジェクトごとに個別に存在します。もう1つの違いは、標準モジュールとは異なり、クラスがインターフェースを実装できることです。

ソース: http://msdn.Microsoft.com/en-us/library/7825002w(en-US、VS.80).aspx

3
Sven Kannenberg

実際には、クラスを使用してオブジェクトを作成します。たとえば、次の.NETコンソールアプリケーションでは、rRectangleオブジェクトです。

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
0
Mahdi Jazini