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?
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.
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.
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é.
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
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