# Objecten
# instantievariabelen
Tot nu toe hebben we steeds met lokale variabelen gewerkt. Deze hebben een scope beperkt tot de methode waarin ze werden gedefinieerd. Echter in sommige gevallen hebben we behoefte aan variabelen die over meerdere methoden heen gebruikt kunnen worden. Zo'n variabele noemen we een instantievariabele.
Ze wordt als volgt gedefinieerd:
public partial class MainWindow : Window
{
// Hier plaats je alle instantievariabelen
private int instantievariabele = 0;
public MainWindow()
{
InitializeComponent();
}
}
2
3
4
5
6
7
8
9
10
# Windows constructor
Als een programma opstart moeten soms stukjes code uitgevoerd worden die enkel bij de opstart nodig zijn. bv enkele parameters invullen. Dat deeltje in onze softwarecode noemen we de Windows constructor.
public partial class MainWindow : Window
{
// Hier plaats je alle instantievariabelen
private int instantievariabele;
// Windows constructor
public MainWindow()
{
InitializeComponent();
// Hier plaats je alle code die bij de opstart eenmalig moet uitgevoerd worden
instantievariabele = 0;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
Oefening
6.1 Schrijf een programma met volgende user interface :
<Grid>
<Slider Name="sld_V" IsDirectionReversed="True" Orientation="Vertical" HorizontalAlignment="Left" Margin="50,10,0,0" VerticalAlignment="Top" Height="250" ValueChanged="sld_V_ValueChanged"/>
<Slider Name="sld_H" HorizontalAlignment="Left" Margin="75,275,0,0" VerticalAlignment="Top" Width="250" ValueChanged="sld_H_ValueChanged"/>
<Canvas Name="paperCanvas" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="75,10,0,0" Background="Beige" Height="250" Width="250"/>
<Label Name="lblVertical" Content="0" HorizontalAlignment="Left" Margin="10,135,0,0" VerticalAlignment="Top"/>
<Label Name="lblHorizontal" Content="0" HorizontalAlignment="Left" Margin="175,300,0,0" VerticalAlignment="Top"/>
</Grid>
2
3
4
5
6
7
Vervolledig het programma met volgende sourcecode:
public partial class MainWindow : Window
{
// instantie variabele
private Ellipse ellipse = new Ellipse();
// windows constructor
public MainWindow()
{
InitializeComponent();
// constructor code
sld_V.Minimum = 1; sld_V.Value = 1;
sld_V.Maximum = paperCanvas.Height;
sld_H.Minimum = 1; sld_H.Value = 1;
sld_H.Maximum = paperCanvas.Width;
lblVertical.Content = Convert.ToString(sld_V.Value);
lblHorizontal.Content = Convert.ToString(sld_H.Value);
CreateEllipse();
}
private void CreateEllipse()
{
ellipse.Width = sld_H.Value;
ellipse.Height = sld_V.Value;
ellipse.Stroke = new SolidColorBrush(Colors.Blue);
ellipse.Margin = new Thickness(0, 0, 0, 0);
paperCanvas.Children.Add(ellipse);
}
private void UpdateEllipse()
{
ellipse.Width = sld_H.Value;
ellipse.Height = sld_V.Value;
}
private void sld_V_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
int vertical = Convert.ToInt32(sld_V.Value);
lblVertical.Content = Convert.ToString(vertical);
UpdateEllipse();
}
private void sld_H_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
int horizontal = Convert.ToInt32(sld_H.Value);
lblHorizontal.Content = Convert.ToString(horizontal);
UpdateEllipse();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Probeer het programma te begrijpen.
Vragen:
- Waarom wordt gebruik gemaakt van een instantievariabele ?
- Waarom worden bepaalde zaken in de windows constructor uitgevoerd ?
- Wat is de functie van de methoden
CreateEllipse()
enUpdateEllipse()
?
# Namespaces
Omdat we niet telkens alles zelf zouden moeten schrijven heeft de .NET omgeving een enorme bibliotheek aan reeds voorgeschreven stukjes code die we in onze programma’s kunnen gebruiken. Die stukjes noemen we namespaces.
We kunnen die als volgt toevoegen aan onze code:
using System.IO;
Het vergt soms wat opzoekwerk om te vinden wat er reeds is en welke namespace je dan precies moet aanspreken. De uitgebreide informatie van .net (opens new window) kan hierbij een hulp zijn.
Oefeningen
6.2 Om willekeurige getallen te genereren maken we gebruik van een nieuwe class Random. Deze is reeds aanwezig in de standaard namespaces dus is er geen behoefte aan een extra namespace, dus hebben we geen nood aan een using verwijzing.
De user-interface ziet er als volgt uit:
<Grid>
<Label Content="The computer guesses that your age is" HorizontalAlignment="Left" Margin="25,25,0,0" VerticalAlignment="Top"/>
<Label Name="lblAge" Content="0" HorizontalAlignment="Left" Margin="250,25,0,0" VerticalAlignment="Top"/>
<Button Name="btnWrong" Content="Wrong" HorizontalAlignment="Left" Margin="25,50,0,0" VerticalAlignment="Top" Width="75" Click="BtnWrong_Click"/>
<Button Name="btnCorrect" Content="Correct" HorizontalAlignment="Left" Margin="125,50,0,0" VerticalAlignment="Top" Width="75" Click="BtnCorrect_Click"/>
</Grid>
2
3
4
5
6
Voeg volgende sourcecode toe:
public partial class MainWindow : Window
{
private int tries = 0;
private Random ageGuesser = new Random();
public MainWindow()
{
InitializeComponent();
lblAge.Content = Convert.ToString(ageGuesser.Next(5, 110));
}
private void BtnWrong_Click(object sender, RoutedEventArgs e)
{
tries++;
lblAge.Content = Convert.ToString(ageGuesser.Next(5, 110));
}
private void BtnCorrect_Click(object sender, RoutedEventArgs e)
{
tries++;
MessageBox.Show($"Number of tries was: {tries}");
tries = 0;
lblAge.Content = Convert.ToString(ageGuesser.Next(5, 110));
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Vragen
Zoek informatie over de class Random op en beantwoord volgende vragen:
- Kan je enkel
integers
genereren met de Random class? .Next(5,10)
levert dit getallen op tussen 5 en 10 inclusief de grenswaarden of niet?- Als je meerdere willekeurige getallen nodig hebt, moet je dan ook meerdere Random variabelen aanmaken?
6.3 Om tijdsgebonden code te kunnen uitvoeren maken we gebruik van een nieuwe class DispatcherTimer uit een nieuwe namespace System.Windows.Threading, dus hebben we nood aan een using verwijzing. De user-interface ziet er als volgt uit:
<Grid>
<Button Name="btnStart" Content="Start" HorizontalAlignment="Left" Margin="25,25,0,0" VerticalAlignment="Top" Width="75" Click="BtnStart_Click"/>
<Button Name="btnStop" Content="Stop" HorizontalAlignment="Left" Margin="25,50,0,0" VerticalAlignment="Top" Width="75" Click="BtnStop_Click"/>
<Button Name="btnClear" Content="Clear" HorizontalAlignment="Left" Margin="25,75,0,0" VerticalAlignment="Top" Width="75" Click="BtnClear_Click"/>
<Label Name="lblGap" Content="10" HorizontalAlignment="Left" Margin="25,350,0,0" VerticalAlignment="Top"/>
<Slider Name="Slider" Minimum="1" Maximum="100" HorizontalAlignment="Left" Margin="25,300,0,0" VerticalAlignment="Top" Width="75" ValueChanged="Slider_ValueChanged"/>
<Canvas Name="paperCanvas" HorizontalAlignment="Left" Height="350" Margin="125,25,0,0" VerticalAlignment="Top" Width="350" Background="Beige"/>
</Grid>
2
3
4
5
6
7
8
Voeg volgende sourcode toe:
public partial class MainWindow : Window
{
// instantie variabelen
private Random randomNumber = new Random();
private int x, y, size;
private SolidColorBrush brush;
private DispatcherTimer timer = new DispatcherTimer();
public MainWindow()
{
InitializeComponent();
// Constructor code
Slider.Value = 10;
lblGap.Content = Convert.ToString(Slider.Value);
brush = new SolidColorBrush(Colors.Blue);
timer.Interval = TimeSpan.FromMilliseconds(Slider.Value);
timer.Tick += timer_Tick;
}
// Stop de timer
private void BtnStop_Click(object sender, RoutedEventArgs e)
{
timer.Stop();
}
// Wis het canvas
private void BtnClear_Click(object sender, RoutedEventArgs e)
{
paperCanvas.Children.Clear();
}
// Nieuw maximum voor het tijdsinterval
private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
lblGap.Content = Convert.ToString(Slider.Value);
}
// Start de timer
private void BtnStart_Click(object sender, RoutedEventArgs e)
{
timer.Start();
}
// Code die bij elke tick van de timer wordt uitgevoerd
private void timer_Tick(object sender, EventArgs e)
{
// willekeurige waarden voor x, y en size
x = randomNumber.Next(0, Convert.ToInt32(paperCanvas.Width));
y = randomNumber.Next(0, Convert.ToInt32(paperCanvas.Height));
size = randomNumber.Next(1, 40);
// de nieuwe ellipse toevoegen
Ellipse ellipse = new Ellipse();
ellipse.Width = size;
ellipse.Height = size;
ellipse.Stroke = brush;
ellipse.Fill = brush;
ellipse.Margin = new Thickness(x, y, 0, 0);
paperCanvas.Children.Add(ellipse);
// Een nieuw willekeurig tijdsinteval instellen
timer.Stop();
int ms = randomNumber.Next(1, Convert.ToInt32(Slider.Value));
timer.Interval = TimeSpan.FromMilliseconds(ms);
timer.Start();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Vragen
- Probeer op een tijdslijn weer te geven wat er precies gebeurt met de class DispatcherTimer.
- Wat is de functie van
timer.Tick += timer_Tick;
?
Taak 6 - Programmeren met objecten
← Klassen Beslissingen →