Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

9.1. Inleiding Object Oriented Programming

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

9.1.1. Klassen en Instanties (Objecten)

De basis van "Object Oriented Programming" (OOP) zijn objecten.

Objecten zijn constructies waarin een toestand en een bepaald gedrag wordt gecombineerd.  Een object bevat dus bepaalde informatie en vertoond een bepaald gedrag.

Objecten kunnen voorstellingen zijn van zowel materiële/concrete zaken ( bijvoorbeeld persoon of auto) als immateriële/abstracte zaken ( bijvoorbeeld afbetaling, reservatie, verhuring, ...).

Alle objecten behoren tot een bepaalde klasse (bij "single classification").  Een object is een instantie van een klasse.
Een klasse kan je bekijken als een sjabloon, een template, een bouwplan, ... voor objecten.  Een object vormt dan een afgietsel, een verwezenlijking, ... van die klasse.

Klassen beschrijven objecten door onder andere te bepalen wat voor informatie deze objecten kunnen bevatten en door te bepalen wat het gedrag is van deze objecten.
In een klasse wordt dus gedefinieerd hoe een bepaald voorstelling wordt ge-abstraheerd.

Wanneer een probleemdomein wordt geanalyseerd of een oplossing voor wordt ontworpen, kan men vaak dit probleem of deze oplossing het eenvoudigst formuleren door de verschillende concepten te gaan omschrijven.  In deze omschrijving gaat men vermelden wat de kenmerken/eigenschappen van deze concepten zijn, en wat er met deze concepten moet kunnen gebeuren.

In een facturatieprogramma zou men kunnen spreken over de concepten artikel, factuurregel en factuur.  Het concept artikel heeft als eigenschap onder andere een bepaalde prijs.  Het concept factuurregel heeft als eigenschap een bepaald artikel en een bepaalde hoeveelheid (van dit artikel).  Het concept factuur heeft dan als eigenschap een verzameling van factuurregels.
Van een factuurregel moet de totale prijs (eenheidsprijs van het artikel maal hoeveelheid) worden bepaald.  Van een factuur moet het totaal (van alle factuurregels) worden bepaald, en dit ook inclusief tax.

Door gebruikt te maken van het hogere abstractieniveau in het object geörienteerd programmeren kan men op eenvoudige wijze een oplossing formuleren voor dit probleemdomein.  Ten slotte dient een klasse net om een concept met eigenschappen en mogelijke acties op deze eigenschappen te gaan definiëren.

Een object geörienteerde aanpak zou als voordeel moeten hebben dat het programma/de programmacode beter herbruikbaar, beter aanpasbaar, beter uitbreidbaar en beter gestructureerd is.

9.1.2. Een Eerste Klasse

Hieronder zien we een eerste klassedefinitie, het betreft een eenvoudige abstractie voor personen, die over een naam eigenschap beschikken.
Visual Basic 2012 Broncode - Codevoorbeeld 211
Class Person
    Private _Name As String                                              ' (1)
    Public Function GetName() As String                                  ' (2)
        GetName = _Name
    End Function
    Public Sub SetName(ByVal value As String)                            ' (3)
        _Name = value
    End Sub
End Class
Om een klasse te definiëren gebruik je een Class ... End Class blok.

Naast Class vermeld je de naam (identifier) van de klasse, de naam van de klasse zal doorgaans een zelfstandig naamwoord zijn, en dient zo duidelijk mogelijk te omschrijven wat objecten van deze klasse zullen voorstellen.

9.1.3. Members

In deze klasse zijn 3 (klasse)members gedefinieerd :
(1) een ingekapseld (Private) veld om hierin de naam van de persoon in te stockeren
(2) een getter functie die de client toelaat (publiek (Public) toegankelijk) de naam van een persoon op te vragen
(3) een setter procedure die de client toelaat (publiek (Public) toegankelijk) de naam van een persoon in te stellen

9.1.4. Methods - Commands en Queries

Functies ("queries") worden doorgaans gebruikt om informatie uit het object op te vragen.

Procedures ("commands") worden doorgaans gebruikt om de toestand van een object te wijzigen.

9.1.5. Access Modifiers

Wat hier ook gedemonstreerd wordt zijn de accessmodifiers Private en Public.  Deze staan steeds vooraan de declaratie of definitie van de klassemember, en geven aan of de member voor de Client (de gebruiker van de klasse (of van objecten van de klasse) Person) toegankelijk is.  Het veld wordt hier ingekapseld (encapsulation) en is dus enkel maar benaderbaar binnen de klasse waarin die member is gedefinieerd.  Typisch is om in de abstractie van de klasse dergelijk private veld te combineren met een publiek toegankelijke getter en setter.  Zo heeft de client toch de mogelijkheid de naam op te vragen of in te stellen voor een bepaalde persoon ( bepaald Person object).  En is het dus niet meer noodzakelijk het veld ( waarin de naam echt gestockeerd zit) publiek toegankelijk te maken, dus kan deze ingekapseld worden.

9.1.6. Naming Guidelines

De volgende richtlijnen voor identifiers van klassen en members worden hier gevolgd :
- een prefix _ of m_ (m verwijst hier naar "memory") voor velden
- "PascalCasing" voor identifier van klassen en publieke members
- "camelCasing" voor ingekapselde members
"PascalCasing" houdt in dat je elk woord in een samenstelling met een hoofdletter doet beginnen, bijvoorbeeld GrootsteGetal.
"camelCasing" is zoals "PascalCasing" maar de eerste letter van de identifier is een kleine letter in plaats van een hoofdletter.

9.1.7. Instantiëren van een Klasse

Visual Basic 2012 Broncode - Codevoorbeeld 212
Module Client1
    Sub Main()
        Dim person1 As New Person                                        ' (4)
        person1.SetName("John")                                          ' (5)
        Console.WriteLine(person1.GetName())                             ' (6)
        '
        Dim person2 As New Person
        person2.SetName("Jane")
        Console.WriteLine(person2.GetName())
        '
        Console.ReadLine()
    End Sub
End Module
Console Application Output
John
Jane
In bovenstaande Client1 ziet u het gebruik van de Person klasse.
Allereerst wordt er een object geconstrueerd en de verwijzing naar dit object gestockeerd in een variabele (4).  Daarna wordt de naam eigenschap voor dit object ingesteld (5), waarna de naam eigenschap van dit object wordt opgevraagd (6).

Alle publieke members van een object (gedefinieerd in de klasse die dergelijke objecten beschrijven) zijn bereikbaar via de punt-notatie (dot-notation).
Na de naam/identifier van de objectvariabele plaatst men een punt gevolgd door de identifier van de publieke member.

Belangrijk om te vermelden is dat alle members hier objectgerelateerd zijn.  Waarmee bedoeld wordt dat als je bijvoorbeeld de SetName method (functies en procedures worden ook wel methods van een klasse genoemd) aanroept voor object person1 (person1.SetName(...)), dat ook weldegelijk de naam voor dat object (waarnaartoe je verwijst) wordt ingesteld, en er dus geen naam eigenschappen voor andere objecten zullen worden aangepast.
Men spreekt ook wel over instancemembers als de members objectgerelateerd zijn.  Een object is tenslotte een bepaalde instantie van een klasse.

Laten we regel (4) eens meer ontleden, wat daar staat is een verkorte notatie voor het volgende : Dim person1 As Person = New Person.
Het New Person gedeelte is een objectinitializer.  Dit bestaat steeds minimaal uit het keyword New en een type specifier (klasse-identifier).  Deze objectinitializer zal een object construeren van dit klassetype.  Dat construeren houdt in dat in het geheugen plaats wordt gereserveerd om de toestand (verzameling van alle veld waarden) van dit object te bewaren.  Deze objectinitializer is ook een expressie, een expressie die resulteert in de referentie (een verwijzing) naar het object.  Het is deze referentie die vervolgens wordt toegekend aan een variabele.  Deze variabele is gedeclareerd, en werd dus in het geheugen aangemaakt, om te kunnen verwijzen naar een object van het geïnitialiseerde type.

9.1.8. Reference Type en Value Type

Het aanmaken van een klasse is eigenlijk het definiëren van een type, om meer specifiek te zijn een referencetype.  Andere (data)types als String werden bijvoorbeeld ook voorgedefinieerd door een bepaalde klasse.
Het gaat hier om een referencetype omdat men naar objecten (instanties) van dit type kan verwijzen aan de hand van een referentie.  Een objectvariabele (een variabele gedeclareerd van een referencetype) bevat tenslotte niet het object zelf, maar bevat de referentie van dit object.
Na (enkel een) declaratie van een referencetype variabele zal deze variabele Nothing (geen referentie) bevatten.  Pas na toekenning van een referentie van een object aan deze variabele, kunnen we de variabele gebruiken om naar dat object te verwijzen.

Dit in tegenstelling tot de declaratie van een value type variabele (zoals variabelen van het type Integer of Char), waarbij de variabele meteen gekoppeld wordt aan een instantie van dat type.

9.1.9. Nothing (Null) en NullReferenceException

Indien onderstaand voorbeeld wordt uitgevoerd, krijgen we een een NullReferenceExeption.

Een "exception" is een fout die optreedt tijden runtime (uitvoering).

De variabele person1 bevat Nothing (ook wel Null genoemd op niveau van .NET) omdat nergens een referentie van een object aan deze variabele werd toegekend.
Het aanroepen van een objectgerelateerde member op deze variabele veroorzaakt dan ook een fout want er is niet geweten op welk object men de implementatie van deze member moet uitvoeren.
Visual Basic 2012 Broncode - Codevoorbeeld 213
Module Client2
    Sub Main()
        Dim person1 As Person
        person1.SetName("John")                                            ' (1)
    End Sub
End Module

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.