Ik heb net ff wat zitten spelen met C# en eens nagegaan hoe constructors in een structuur van classes die van elkaar overerven zich gedragen.
Stel deze code:
Nu, wat is de output van dit simpel programmaatje?
Mijn eerste idee was dit:
Echter, niets is minder waar. Dit is de output:
Als je door de code stept mbhv de debugger, dan zie je dat bij de creatie van het Derived object, de constructor van de Base class ook aangeroepen wordt voordat de constructor van Derived zelf wordt aangeroepen.
Base roept de MyMethod method aan, en de overriden method van Derived wordt uitgevoerd. Daarna wordt de constructor van Derived zelf uitgevoerd, en wordt de MyMethod ook nog eens uitgevoerd.
Nu vraag ik me echter af:
Waarom wordt die constructor van Base eigenlijk aangeroepen? Ik geef in m'n code nl. nergens aan dat die constructor moet aangeroepen worden; er staat nl. niet:
Is dit eigenlijk logisch? Derived is eigenlijk een Base, en dan kan je stellen dat die constructor moet aangeroepen worden. Als je geen standaard constructor opneemt in beide classes, maar die vervangt door een one-argument constructor, dan klaagt de compiler als je de base-constructor niet expliciet aanroept.
Stel deze code:
code:
1
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
| class Base
{
public Base()
{
MyMethod();
}
public virtual void MyMethod()
{
Console.WriteLine ("In Base class method");
}
}
class Derived : Base
{
public Derived()
{
MyMethod();
}
public override void MyMethod()
{
Console.WriteLine ("In Derived");
}
}
class Program()
{
public static void Main()
{
Base b = new Base();
Base d = new Derived();
}
} |
Nu, wat is de output van dit simpel programmaatje?
Mijn eerste idee was dit:
code:
1
2
| In Base class Method In Derived |
Echter, niets is minder waar. Dit is de output:
code:
1
2
3
| In Base class Method In Derived In Derived |
Als je door de code stept mbhv de debugger, dan zie je dat bij de creatie van het Derived object, de constructor van de Base class ook aangeroepen wordt voordat de constructor van Derived zelf wordt aangeroepen.
Base roept de MyMethod method aan, en de overriden method van Derived wordt uitgevoerd. Daarna wordt de constructor van Derived zelf uitgevoerd, en wordt de MyMethod ook nog eens uitgevoerd.
Nu vraag ik me echter af:
Waarom wordt die constructor van Base eigenlijk aangeroepen? Ik geef in m'n code nl. nergens aan dat die constructor moet aangeroepen worden; er staat nl. niet:
code:
1
2
3
4
| public Derived() : Base()
{
//
} |
Is dit eigenlijk logisch? Derived is eigenlijk een Base, en dan kan je stellen dat die constructor moet aangeroepen worden. Als je geen standaard constructor opneemt in beide classes, maar die vervangt door een one-argument constructor, dan klaagt de compiler als je de base-constructor niet expliciet aanroept.
https://fgheysels.github.io/