מחלקה.
התחום השני שהו קוד יכול להתקיים הוא המחלקה (Class). המחלקה או האובייקט הוא מושג מרכזי בשפה. רבים מרכיבי ה-VB הם מחלקות, וביניהם אפשר למנות את הטפסים, הפקדים ופקדי המשתמש. למעשה אף המשתנים הרגילים הם טיפוסי אובייקטים.
כל מחלקה צריכה להתחיל במילה השמורה - Class ולהסתיים ב- End Class.
למחלקה יכולים להיות שגרה בונה New()‎ ושגרה הורסת Finalize()‎, כדי שיהיה אפשר לשלוט על הקוד ביצירתו של האובייקט ובסגירתו. כל מחלקה יכולה להכיל טיפוסים, מבנים, קבועים, משתנים, שיטות, תכונות ואירועים.
כל מחלקה יכולה להוריש את תכונותיה למחלקת בן (באמצעות המילה השמורה Inherits). ההתייחסות למחלקה הנוכחית (Me), למחלקת הבסיס (MyBase). אפשר לבצע דריסה של שגרה או פונקציה במחלקה היורשת (המוגדרת כ-Overrides) על גבי שגרה/פונקציה של מחלקת הבסיס (המוגדרת כ-Overridable), ב-VB אפשר גם ליצור מחלקה אבסטרקטית שהיא מחלקת בסיס שנועדת לירושה בלבד ולא ליצירת מופע ממשי (MustInherits). במחלקה כזאת ניתן לכפות יצירה של שגרות ומאפיינים במחלקות היורשות (MustOverride). מאידך ניתן גם ליצור מחלקה שאיננה נורשת, אלא משמשת רק למופע (NotInheritable).
ניתן לפצל מחלקה אחת למספר קבצים, כך שכל קובץ יכיל חלק מהגדרות המחלקה (Partial). בטפסים המערכת עושה שימוש בתכונה זו, כדי להפריד בין הגדרות הפקדים לבין הלוגיקה של המתכנת.
לשפה יש יכולת להעמסת פונקציות/שגרות. העמסה (OverLoading) היא היכולת להעמיס באותה מחלקה כמה שגרות/פונקציות באותו שם. הדבר יעיל במיוחד כאשר ישנם מספר אופנים של טיפול לדבר מסוים. כך ניתן לרכז מספר רב של פעולות דומות תחת קורת גג אחת. ההבדל בין השגרות/פונקציות יהיה בפרמטרים שלהם: במספרם, בטיפוסם ובסידורם, שחייב להיות שונה, שאילולי כן התוכנית לא תדע לאיזו פונקציה/שגרה להתייחס בזמן הקריאה. (החל מגרסת 2005 נוספה גם אפשרות להעמסת אופרטורים במחלקות).
ב-VB אפשר ליצור מחלקות מקוננות (מחלקה שמכילה מחלקה נוספת), אבל לא פונקציות מקוננות.
Imports Namespace.Class
Public Class ClassName
Inherits ClassBase
'משתנים כלליים
Dim|Private|Public Variable1 As Type, Variable2 As Type
'שגרה
Private|Public Sub SubName(ByVal|ByRef ParametName As Type) [Handles Object.Event]
Dim LocalVariable As Type
End Sub
Private|public Function FunctionName(ByVal|ByRef ParametName As Type) As Type
Dim LocalVariable As Type
return LocalVariable
End Function
End Class
כדי ליצור מופע חדש של אובייקט, יש להגדיר אותו (New). ניתן ליצור חברים סטטיים במחלקה (באמצעות הקדמת המילה Shared למשתנה, למתודה או למאפיין). בשיטה זו ניתן ליצור פונקציות גלובליות ללא שימוש במודולים של VB.
מאפיינים.
לכל מחלקה יכולות להיות מאפיינים (Property). המאפיין מהווה חלק מיישום הכמיסות של המחלקה. לחסום אפשרות של עדכון ישיר של משתני מחלקה מבחוץ, ללא בקרה של המחלקה. באמצעות המאפיינים מאפשרים למשתמש במחלקה לעדכן או לקבל מידע ממנה, ועם זאת לבקר את פעולותיו, ולמנוע ממנו גישה חופשית לגמרי, שעלולה לפגום בנתונים ובזאת הופכים את המאפיין ל"משתנה חכם".
המאפיין שיוגדר כפומבי מהווה למעשה פילטר וחוצץ, בין המשתנה הפרטי ש"מוטמן" בעמקי המחלקה לבין המשתמש של המחלקה. באמצעות המאפיינים ניתן גם לחסום את הקריאה (מאפיין לכתיבה בלבד) או את הכתיבה (מאפיין לקריאה בלבד) למאפיין, כאשר פשוט פקודת Get או פקודת Set מושמטת בהגדרתו, והמאפיין מוכרז לקריאה/כתיבה בלבד. המאפיין הופך למעשה את המשתנה הפסיבי, למשתנה אקטיבי שיש לו יכולת בקרה, שליטה ומניפולציה על התוכן שמושם בו או נלקח ממנו.
ב-VB פקודות Get ו-Set של מאפיינים היו נפרדים, מה שעשה את התוכנה לפחות קריאה. ב-VB.NET פקודות ההשמה ('Set) והקבלה "("Get) מרוכזות במאפיין אחד.
Private LocalVariable As VariableType
Public Property MyProperty() As VariableType
Return LocalVariable
End Get
Set(ByVal value As VariableType)
LocalVariable = value
End Set
End Property
בדוגמה לעיל ללקוח שישתמש באובייקט, יהיה קיים מאפיין בשם MyProperty, שבאמצעותו הוא יהיה נגיש למשתנה LocalVariable של המחלקה, לפקודות של השמה ושל קבלה. בדוגמה לא נעשה שימוש בבקרה או במניפולציה על המאפיין, אבל בהחלט ניתן ומומלץ לעשות כן. יש לשים לב שסוג הפרמטר של התכונה ושל ה-SET שלה, חייבים להיות זהים.
כמו כן ניתן ליישם ב-VB.NET מאפיינים עם פרמטרים, בדומה לפונקציה. הדבר יכול להיות שימושי בהתייחסות למערכים, במטרה לבצע שליפה של איבר במערך או השמה אליו. בדוגמה מאפיין בשם Bytes שמחזיר/משים איבר מסוים במערך של בתים.
Private _Bytes() As Byte
Public Property Bytes(ByVal index As Integer) As Byte
Return _Bytes(index)
End Get
Set(ByVal value As Byte)
_Bytes(index) = value
End Set
End Property
החל מגרסה 2010 ניתן ליצור מאפיין מיושם אוטומטי (Auto-Implemented Properties) בשורה בודדת, שבהן הגדרת מאפיין יוצרת משתנה פרטי נסתר שתואם לטיפוס המשתנה. השימוש במאפיין כזה שימושי ונוח כאשר רוצים מאפיין פשוט, ללא כל צורך לעשות בדיקות בהשמה של המאפיין.
Public Property Name As String
אירועים.
שפת ה-VB היא ביסודה גם שפה מונחת אירועים. זאת אומרת שאינטראקציה בין אובייקטים והעברת הודעות נעשית באמצעות אירועים (האובייקט המתארח מדווח לאובייקט המארח), וכמעט כל תוכנה שנכתבת בשפה משתמשת בהם. למעשה לחלק ניכר מהרכיבים המובנים בשפה, קיימים אירועים שונים שמתבצעים בתנאים שונים. האירועים הנפוצים ביותר קשורים לפעולת המשתמש כמו אירועי מקלדת ועכבר, אך יכולים להיות אירועים נוספים כמו אירועים הקשורים לפעילות התוכנה, כמו בעת הרצת התוכנה ובעת סגירתה, סיום ביצוע פעילות מסוימת, או אירועי שעון מערכת. ב-VB.NET הורחבו האירועים של האובייקטים השונים למקרים רבים, כך שהם מכסים טווח נרחב יותר של אופציות, ומגבירים בכך את הגמישות התכנותית.
ב-VB6 הקשר בין אובייקט לאירוע חד-חד ערכי, לעומת זאת ב-VB.NET הקשר בין אובייקט לאירוע הוא רב ערכי, כך שאירוע יכול להיות מוזנק על ידי מספר רב של אובייקטים אף מטיפוסים שונים (באמצעות הידית (Handles) שיכולה להיות מוצמדת לסוף כותרת השגרה. (ולצורך כך אף הוסף פרמטר בשם Sender בשגרות אירוע, שבאמצעותו ניתן לזהות את האובייקט שמזניק את האירוע). כמו כן, אובייקט אחד יכול להזניק מספר רב של אירועים בו זמנית בפעילות בודדת.
בדוגמה, ארבעה כפתורים שקשורים לאותו אירוע, והתוצאה בלחיצה על אחד מהכפתורים הללו תהיה הודעה למסך עם שמו של הכפתור המזניק.
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click
MessageBox.Show("Name: " &amp; sender.Name)
End Sub
למעשה אפשר להגדיר אירוע ולהזניקו בכל הליך תכנותי. הדבר חיוני בתכנות מונחה עצמים, לתקשר עם החוץ, ולהוציא הודעות בסיטואציות מסוימות אל מחוץ למחלקה. כדי ליצור אירוע יש:
כדי ללכוד אירוע יש:
בדוגמה הבאה ניתן לראות שתי מחלקות. במחלקת People מוגדרת פונקציה CheckBirthDate, שבודקת אם חל היום יום ההולדת, ומזניקה את האירוע BirthDate במידה והתשובה חיובית, עם חישוב של הגיל. ובמחלקת Form1 ממומש אובייקט של People שלוכד את האירוע BirthDate בעת שהוא יוזנק במחלקת People. הדבר מאפשר לכמוס את הבדיקה במחלקת People, ולא להכביד על מחלקת Form1 בבדיקות מיותרות.
Public Class Form1
Private WithEvents people1 As People = New People()
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
people1.Id = "068557588585"
people1.Name = "John Doe"
people1.DateOfBirth = #8/30/1999#
End Sub
Sub BirthDate(ByVal sender As Object, id As String, ByVal age As Integer) Handles people1.BirthDate
Console.WriteLine(id.ToString() &amp; " " &amp; age.ToString())
End Sub
End Class
Public Class People
Public Property Id As String
Public Property Name As String
Public Property DateOfBirth As Date
Public Event BirthDate(ByVal sender As Object, id As String, ByVal age As Integer)
Private Sub CheckBirthDate() ' Operate by timer once a day
If (DateOfBirth.Month = Date.Today.Month And DateOfBirth.Day = Date.Today.Day) Then
RaiseEvent BirthDate(Me, Id, DateDiff(DateInterval.Year, DateOfBirth, Date.Today))
End If
End Sub
End Class
מבנה - Structure.
מבנה (יורשו של ה-Type מה-VB6) בעוד שב-VB6 יכל רק לאגד בתוכו משתנים תחת מרחב שם משותף, בדוט נט בהשראת שפת ++C הוא הורחב מאוד, והפך לסוג של טיפוס שיכול להכיל בתוכו משתנים, מתודות, מאפיינים ואף אירועים ושגרת בנאי. ולמעשה מתנהג כמו מחלקה שיכולותיה הוגבלו מעט וברירות המחדל שלה שונו. אמנם עיקר השימוש שבו נותר ליצור טיפוס משתמש, שמאגד משתנים מסוגים שונים שיש להם עניין משותף.
Private Structure BookType
Dim Title As String
Dim URL As String
Dim Page As integer
End Structure
כאשר מגדירים משתנה מטיפוס זה (עם פקודת New) ניתן לאתחל אותו בהגדרה, כפי שניתן לעשות במחלקה.