web-dev-qa-db-fra.com

Quelle est la différence entre un module et une classe?

Lors de l'ajout d'un nouveau fichier à un projet VB.Net dans Visual Studio, l'option «Class» et un «Module» me sont proposées. Une classe est décrite comme

An empty class file

Alors qu'un module est décrit comme

A file for storing groups of functions

Cela semble impliquer qu'un module est moins utile qu'une classe, puisqu'une classe peut stocker des groupes de fonctions et plus.

Est-il vrai qu'un module est simplement un groupe de fonctions ou existe-t-il plus que ce que la documentation de Visual Studio suggère?

13
Stephen

Une classe est un type. Vous pouvez utiliser ce type comme n'importe quel autre type (String, Integer, Date, FileInfo ...) pour déclarer des variables, des paramètres, des propriétés et des types de retour de fonction.

Faisons un petit exemple:

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

Vous pouvez maintenant déclarer des variables de type 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

Alors que les modules sont statiques. C'est à dire. Les données stockées dans un module existent exactement une fois. D'un autre côté, vous n'avez pas besoin d'instancier un module avec New; par conséquent, ils sont souvent utilisés pour stocker des données globales et pour des méthodes disponibles globalement. Par exemple, vous pouvez stocker la liste des personnes dans un module.


Mais vous pouvez faire beaucoup plus avec les cours. Vous pouvez dériver une classe d'une classe de base. Cette nouvelle classe hérite de tout de la classe de base et peut lui ajouter des éléments. Par exemple, vous pouvez dériver une classe Employee à partir de 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

Le mot clé Overridable dans Person.Print permet aux classes dérivées de redéfinir (pour remplacer) la méthode Print. (Les fonctions et les sous-classes dans les classes sont appelées méthodes.)

Les employés sont des affectations compatibles avec les personnes. Vous pouvez ajouter un employé à la liste persons. Cela ne nécessite aucune modification de la boucle For Each, c’est-à-dire que l’appel de person.Print() appelle automatiquement la bonne méthode Print (la première pour les personnes "normales" et la seconde pour les employés).

Dim emp as Employee

emp = New Employee()
emp.FirstName = "Frank"
emp.LastName = "Taggart"
emp.Salary = 3500.00D

persons.Add(emp)

Il y a beaucoup plus à dire sur les classes. J'espère que vous avez une certaine idée de ce que vous pouvez faire avec les cours.

12

Une classe est plus une unité, et un module est essentiellement une collection lâche de choses telles que des fonctions, des variables ou même des classes.

Dans un module public, les classes du projet ont accès aux fonctions et aux variables du module. Vous n'avez pas à spécifier le nom du module pour en adresser un. Vous pouvez également avoir des cours dans un module.

Les variables et les fonctions d'une classe sont plus étroitement "possédées" par la classe. Les variables publiques et les fonctions (méthodes) utilisées par d'autres classes sont utilisées avec le nom de classe: classname.method, contrairement à celles contenues dans les modules.

Il n'y a qu'une seule instance d'un module, mais une ou plusieurs instances d'une classe peuvent être utilisées à la fois.

6
xpda

Un module n'est rien d'autre qu'un autre nom pour une classe statique. 
C'est tout ce qu'on peut en dire. 
Si vous ne le croyez pas, compilez un module avec VB.NET et décompilez-le avec ILSpy en utilisant C-Sharp.

Et oui, cela signifie que vous avez raison, en termes de fonctionnalité, un module est un sous-ensemble d'une classe. 
Il s’ensuit qu’en termes de fonctionnalité, une classe est un SUPERset d’un module, car elle peut contenir des méthodes & variables statiques et non statiques, ainsi que les modificateurs d’accès virtuel et protégé.

6
Stefan Steiger

La principale différence entre les classes et les modules est que les classes peuvent être instanciées en tant qu'objets, contrairement aux modules standard. Comme il n'y a qu'une copie des données d'un module standard, lorsqu'une partie de votre programme modifie une variable publique dans un module standard, toute autre partie du programme obtient la même valeur si elle lit ensuite cette variable. En revanche, les données d'objet existent séparément pour chaque objet instancié. Une autre différence est que contrairement aux modules standard, les classes peuvent implémenter des interfaces.

Source: http://msdn.Microsoft.com/en-us/library/7825002w(en-US,VS.80).aspx

3
Sven Kannenberg

En fait, vous utilisez des classes pour créer des objets. Par exemple, dans la console .NET suivante, l'application r est un objet 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
0
Mahdi Jazini