c# : klassen en objecten

  1. Voorbereiding
  2. Inleidng
  3. Classificatie
  4. Encapsulatie
  5. Een klasse definiëren
  6. Een klasse gebruiken
  7. Constructors
  8. Partial classes
  9. static
  10. Anonieme klasse
  11. Class library

Voorbereiding

  • Maak een nieuwe Visual Studio solution Klassen.
  • Maak in de solution Klassen een nieuwe WPF Application WpfKlassen.
  • Inleiding

    In de lessenreeks heb je tot hiertoe gerbuik gemaakt van een aantal classes: Console, MessageBox, Exception, ....
    Het .Net Framework telt echter duizenden dergelijke klassen, je kan dit aantal uitbreiden door zelf nieuwe klassen aan te maken.

    Classificatie

    Wanneer je een klasse ontwerpt ga je informatie systematisch classificeren in een entiteit. Dit classificeren is iets wat iedereen doet, niet alleen programmeurs. Je hebt in het dagelijkse leven bijvoorbeeld een entiteit met de naam auto. Niemand kan exact beschrijven wat de entiteit auto eigenlijk inhoud, het begrip auto is eigenlijk een blauwdruk voor hetgeen waarvan wij een concreet beeld hebben. Een instantie van dit begrip (of de klasse) auto is dan bijvoorbeeld een grijze, handmatig versnelde Opel met een lederen interieur en ABS.

    Een klasse in het object georiënteerd programmeren de basis voor eender welke entiteit.

    Voorbeelden:

    Een klasse vormt een sjabloon dat aangeeft hoe een instantie van die klasse (een object) er zal uitzien.

    In het dagelijkse leven zou je ook kunnen zeggen dat de klasse Auto een sjabloon is voor alle reële auto's, en voor elke auto vastlegt dat deze kan accelereren, remmen, wat de topsnelheid is, of er ABS aanwezig is, ...

    Encapsulatie

    Een van de bedoelingen van objectgeoriënteerd programmeren (waar klassen en hun instanties genaamd objecten aan de basis liggen) is het afschermen van informatie, het opsplitsen van je applicatie in functionele eenheden.

    Een klasse definiëren

    Een klasse kan dus fields (variabelen) als methoden bevatten.
    Zowel variabelen als methoden kwamen al aan bod tijdens een vorig hoofdstuk.

    Een klasse gebruiken

    Een klasse vormt een sjabloon, een blauwdruk voor objecten of instanties.
    De klasse Circle kunnen we nu dus gebruiken om Circle-objecten of Circle-instanties aan te maken.

    Voorzie een Window_Loaded eventhandler in Window1:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
    	Circle c; //Circle-variabele declareren
    	c = new Circle(); //Circle-variabele initialiseren
    	
    }
    

    Probleem:

    Fields en methods binnen een klasse zijn standaard gedeclareerd als private: ze kunnen enkel gebruikt worden binnen de klasse zelf.

    Cosntructors

    default constructor

    Wanneer je het sleutelwoord new gebruikt geef je de opdracht een nieuw object of een nieuwe instantie te maken op basis van een klasse.
    .Net moet nu een stuk geheugen reserveren voor alle fields van het nieuwe object.

    Met een constructor in een klasse is het mogelijk velden van een nieuw object onmiddellijk te initialiseren.
    Wanneer je zelf geen constructor voorziet in je klasse, dan genereert de compiler een standaardconstructor voor je klasse: elk veld van de klasse moet nu eenmaal geïnintialiseerd worden.

  • Volgend stukje code komt overeen met de standaardconstructor die voor onze klasse Circle gemaakt zou worden (je mag deze code voorzien in je klasse):
    class Circle
    {
    	public int radius;
    
    	public Circle() //standaard parameterloze constructor
    	{
    		radius = 0;
    	}
    
    	public double Area()
    	{
    		return Math.PI * radius * radius;
    	}
    }
    
    

    Wanneer een nieuw Circle-object gemaakt wordt, wordt radius op 0 ingesteld (dit is ook zo als we zelf geen defaultconstructor voorzien).

    Conclusie:

    Constructors overloaden

    Daar constructors eigenlijk speciale methoden zijn, kunnen we deze net zoals gewone methoden overloaden.

    Een constructor heeft nooit een returnwaarde, overloads van een constructor zullen dus enkel verschillen in de parameterlijst.

  • Voorzie een nieuwe constructor in de klasse Circle:
    public int radius;
    
    public Circle() //standaard parameterloze constructor
    {
    	radius = 0;
    }
    
    public Circle(int beginRadius) //constructor waarbij we meteen de radius initialiseren
    {
    	radius = beginRadius;
    }
    
    public double Area()
    {
    	return Math.PI * radius * radius;
    }
    
  • We kunnen in Window1 een Circle op volgende manier instantiëren:
    Circle c;
    c = new Circle(5);
    
    double opp = c.Area();
    MessageBox.Show(opp.ToString());
    

    Opgepast, dikwijls wordt in een constructor een argument ontvangen in een variabele met dezelfde naam als een bestaand field. Nu moet je het sleutelwoord this gebruiken om te verwijzen naar het field:

    public Circle(int radius) //constructor waarbij we meteen de radius initialiseren
    {
    	this.radius = radius;
    }
    
  • Partial classes

    Een klasse kan veel methoden, velden, constructors en andere items bevatten.
    Een nuttige klasse kan op die manier behoorlijk omvangrijk worden.
    Met C# kan je de broncode voor een klasse uitsplitsen in meerdere beheersbare stukken code, en zelfs over meerdere fysieke bestanden.
    Dit principe wordt eigenlijk gebruikt in elke WPF-toepassing of ASP.Net Website die je maakt en heet partial classes.

    static

    In de voorgaande voorbeelden heb je gebruik gemaakt van de constante PI door de eigenschap PI van de klasse Math op te vragen: Math.PI.
    Je hebt een vierkantswortel en een macht berekend met de methoden Math.Sqrt en Math.Pow

    Static method

    Wanneer je hier wat dieper bij nadenkt, dan merk je dat dit in ons voorbeeld met de klasse Point zou neerkomen op de code Point.DistanceTo om de afstand tussen punten te berekenen.
    Dit lukt echter niet, DistanceTo is bij ons een instantiemethode: we hebben een instantie van de klasse Point nodig:

    Point p = new Point(5,6)
    p.DistanceTo(...
    

    Zoals de voorbeelden met de klasse Math aantonen is het ook mogelijk om methoden, maar ook fields te declareren die je rechtstreeks met de naam van de klasse kan aanroepen. Dergelijke methoden of fields noemen we static.

    Static field

    Anonieme klasse

    Een anonieme klasse is een klass die (zoals je wellicht vermoedt) geen naam heeft.
    In sommige toepassingen binnen .Net, zoals Linq, wordt dit intensief gebruikt.
    var anoniempje = new { Naam = "William", Leeftijd = 35 };
    MessageBox.Show(
    	String.Format(
    		"anoniempje heet {0} en is van het type {1}"
    		,anoniempje.Naam
    		,anoniempje.GetType().Name
    	)
    		);
    

    Hier wordt een anonieme klasse gemaakt met twee eigenschappen Naam en Leeftijd.
    In de MessageBox zie je de door de compiler toegekende klassennaam.

    Class library

    De klassen zoals Circle en Point zijn voor ons enkel bruikbaar in de WPF-toepassing WpfKlassen, ze maken deel uit van deze WpfApplicatie.
    Het zal natuurlijk vaak voorkomen dat je een klasse of een verzameling van klassen wenst te hergebruiken in een andere applicatie. Dit kan een andere WPF-applicatie, maar ook een Winform, Console, ASP.Net, ... toepassing zijn.

    Een eerte manier om een klasse te hergebruiken kan zijn om de cs-files heel eenvoudig te kopiëren naar een ander project, eventueel het namespace-argument aan te passen en klaar is Kees.
    Wanneer je nu iets verder denkt zie je meteen in dat dit niet 'the way to go' is: wat als we een aanpassing willen doen aan een klasse? Gaan we nu alle projecten openen waarin we die klasse hebben gekopiëerd en doen we zoveel keer die aanpassing? Al vlug zal je in een situatie verzeild raken waar je verschillende versies van dezelfde klasse hebt.

    Een veel doordachter en onderhoudsvriendelijker aanpak is het herbergen van je klassen in een Class Library: een klassenbibliotheek.

    Meer tutorials:
    leer ook: html | xhtml | css | asp | asp.net | c# | ado.net | linq | ajax | java | javascript
    Valid HTML 4.01! Valid CSS! © - Cursusweb