Ako sad pozoves F() nad svim tim objektima:
Code:
b1.F();
c1.F();
d1.F();
svaki poziv ce da ti vrati:
Code:
I am B
Pozivajuci funkciju F() nad referencom tipa A, kada A nije samo A, vec i B (C, D), aktivira se polimorfizam.
Tada se trazi najkasnije overridovana definicija funkcije F(); U slucaju b1, to bi bila definicija u klasi B. Medjutim klasa C prekida nasledjivanje zbog kljucne rijeci new, tako da je i za klasu C najkasnije redefinisana fukcija F() ona u klasi B. Isto vazi i za D.
Da je funkcija u klasi C deklarisana ovako:
Code:
public override void F() { Console.WriteLine("I am C"); }
rezultati bi ti bili:
Code:
I am B
I am C
I am D
jer se lanac nasledjivanja nidje ne prekida.
a da je funkcija u klasi C deklarisana ovako (bez virtual):
Code:
public new void F() { Console.WriteLine("I am C"); }
kompajler bi prijavio gresku u klasi D.