25.07.2017 Views

Intro-CSharp-Book-v2015

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

828 Въведение в програмирането със C#<br />

}<br />

}<br />

// ...<br />

public class OverrideExample<br />

{<br />

public static void Main()<br />

{<br />

AfricanLion africanLion = new AfricanLion(true, 80);<br />

string asAfricanLion = africanLion.ToString();<br />

string asObject = ((object)africanLion).ToString();<br />

Console.WriteLine( asAfricanLion );<br />

Console.WriteLine( asObject );<br />

}<br />

}<br />

Резултатът е следният:<br />

(AfricanLion, male: True, weight: 80)<br />

Chapter_20_OOP.AfricanLion<br />

Press any key to continue . . .<br />

Забелязваме, че когато направим upcast на AfricanLion към object, се<br />

извиква имплементацията Object.ToString(). Тоест, когато използваме<br />

ключовата дума new създаваме нов метод, който скрива стария и можем да<br />

го извикаме само чрез upcast.<br />

Какво става, ако в горния пример върнем думата override? Вижте сами<br />

резултата:<br />

(AfricanLion, male: True, weight: 80)<br />

(AfricanLion, male: True, weight: 80)<br />

Press any key to continue . . .<br />

Изненадващо, нали? Оказва се, че когато пренапишем метода (override)<br />

дори и с upcast не можем да извикаме старата имплементация. Това е,<br />

защото вече не съществуват 2 метода ToString() за класа AfricanLion, а<br />

само един – пренаписан.<br />

Метод, който може да бъде пренаписан, се нарича виртуален метод. В<br />

.NET методите по подразбиране не са такива. Ако желаем един метод да<br />

може да бъде пренаписан, можем да укажем това с ключовата дума virtual<br />

в декларацията на метода.<br />

Изричното указване на компилатора, че искаме да пренапишем метод от<br />

базов клас (с override), е защита против грешки. Ако случайно сбъркаме<br />

една буква от името на метода, който се опитваме да пренапишем, или

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!