лекции (2008) (by Kravets), страница 22
Описание файла
PDF-файл из архива "лекции (2008) (by Kravets)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 22 страницы из PDF
Ðåàëèçàöèþ ìåòîäîâ èíòåðôåéñà (ÿâíàÿ èëè íåÿâíàÿ)2. Èíòåðôåéñû è âèðòóàëüíûå ìåòîäû.Èíòåðôåéñû â Ñ++class Interface{public:virtual void f() = 0;virtual int g() = 0;virtual void ~Interface (){}}; Èíòåðôåéñå íå äîëæíî áûòü íå âèðòóàëüíûõ ìåòîäîâ, ÷ëåíîâ äàííûõ èëè ïðèâàòíûõ ÷ëåíîâ. Òàêèì îáðàçîì èíòåðôåéñ ñîñòîèò òîëüêîèç óêàçàòåëåé íà òàáëèöó âèðòóàëüíûõ ìåòîäîâ.Åäèíñòâåííûé ìåòîä, êîòîðûé ìîæåò èìåòü ðåàëèçàöèþ â èíòåðôåéñå - äåñòðóêòîð.Âîçìîæíà ñèòóàöèÿ, êîãäà â êëàññå èíòåðôåéñà îòñóòñòâóåò äåñòðóêòîð (äåñòðóêòîð ïî óìîë÷àíèå).
Åñëè äåñòðóêòîð íå âèðòóàëüíûé, òî ìûíå ìîæåì ïîëüçîâàòüñÿ èì êàê èíòåðôåéñîì.  òàêîì ñëó÷àå òðåáóåòñÿ,÷òîá íàñëåäóþùèé êëàññ ñîäåðæàë â ñåáå óäàëåíèå îáúåêòà - èíòåðôåéñà.Äðóãîé âàðèàíò èñïîëüçîâàíèå òàêîãî - çàïðåò íà óäàëåíèå îáúåêòîâ- èíòåðôåéñîâ. òåõíîëîãèè COM èíòåðôåéñû - âñåãäà ÷èñòî àáñòðàêòíûé êëàññ.Ýòà òåõíîëîãèÿ ïîäðàçóìåâàåò èñïîëüçîâàíèå ñàìûõ ðàçíûõ êîíòåêñòîââûïîëíåíèÿ (â îòëè÷èè îò .NET), òî åñòü çíàòü êàê óíè÷òîæèòü îáúåêòìîæåò çíàòü òîëüêî ñàì îáúåêò.144class IUnknown{public:virtual int QueryInterface (IID id, IUnknown ** punk) = 0;virtual int AddRef () = 0;virtaul int Release () = 0;}; ýòîì êëàññå íåò äåñòðóêòîðà.
Òîò äåñòðóêòîð, êîòîðûé áóäåò ñãåíåðèðîâàí ïî óìîë÷àíèþ áåñïîëåçåí, è íèêîãäà íå áóäåò âûçâàí. Óäàëåíèåîáúåêòà ðåàëèçîâàíî íà îñíîâå ïîäñ÷åòà ññûëîê íà îáúåêò ÷åðåç ìåòîäûRelease è AddRef.Ïðè ýòîì ëþáîé êîíêðåòíûé êëàññ, êîòîðûé ðåàëèçóåò ýòîò èíòåðôåéñ äîëæåí ðåàëèçîâàòü ýòè ìåòîäû.Âòîðîé âàðèàíò èñïîëüçîâàíèÿ èíòåðôåéñîâ â Ñ++ - ýòî îáåëåíèåêîíòðàêòà.class Iset{public:virtual void Include (T&) = 0;virtual void Exclude (T&) = 0;};class BitScale {};class SList {};class SetList:public Iset,private SLIst{....};Ïðè ýòîì ìû âñåãäà ìîæåò çàìåíèòü SList íà BitScale, ïðè÷åì ïîòðåáóåòñÿ òîëüêî ïåðåòðàíñëèðîâàòü ìîäóëü.Èíòåðôåéñû â ÿçûêå JavaInterface IDrawable{void Draw ();static int final SomeConst = 1;} èíòåðôåéñå ìîãóò ñîäåðæàòüñÿ òîëüêî îáúÿâëåíèÿ ìåòîäîâ, à òàê æåñòàòè÷åñêèõ ÷ëåíîâ è êîíñòàíò. Ïî óìîë÷àíèþ âñå èíòåðôåéñû èìåþòïðàâèëî âèäèìîñòè public.145Åñëè êëàññ íàñëåäóåò íåêîòîðûé èíòåðôåéñ, òî îí äîëæåí ëèáî ðåàëèçîâàòü âñå ìåòîäû äàííîãî èíòåðôåéñà, ëèáî áûòü àáñòðàêòíûì.abstract class Receiver implements IMsg{public void Receive (Message M){}} Ñ++ ïðè ìíîæåñòâåííîì íàñëåäîâàíèè ìîæåò ñóùåñòâîâàòü íåñêîëüêî òàáëèö âèðòóàëüíûõ ìåòîäîâ.
 ÿçûêàõ ñ åäèíè÷íûì íàñëåäîâàíèåìâñå âèðòóàëüíûå ìåòîäû îáúåäèíÿþòñÿ â îäíó áîëüøóþ òàáëèöó.Ðåàëèçàöèÿ èíòåðôåéñà Java èìååòñÿ íåÿâíàÿ ðåàëèçàöèÿ èíòåðôåéñà, òî åñòü êëàññ ðåàëèçóåò èíòåðôåéñ, êîãäà êàæäîìó ìåòîäó èíòåðôåéñà ñîîòâåòñòâóåò îäèíïóáëè÷íûé ìåòîä êëàññà.Interface IDrawable{void Draw ();static int final SomeConst = 1;};interface Card{void Draw ();};class CartGame implements IDrawable, Card{}; ñëó÷àå íåÿâíîé ðåàëèçàöèè èíòåðôåéñà ìû íå ìîæåì ðåàëèçîâàòüDraw äëÿ îáîèõ èíòåðôåéñîâ.interface I{void f();}interface A implements I{}interface B implements I{}class X implements A, B {}Âîïðîñ - êàêîå çäåñü íàñëåäîâàíèå (Ñ# è Java) ðîìáîâèäíîå èëèîáû÷íîå?Ïîñëåäíÿÿ îñîáåííîñòü Java - èíòåðôåéñû - ìàðêåðû.
Êàæäûé èíòåðôåéñ îïðåäåëÿåò "êîíòðàêò ïðè ýòîì èíòåðôåéñû - ìàðêåðû îïðåäåëÿþòñàìûé ÷èñòûé êîíòðàêò, òî åñòü íå èìåþò ìåòîäîâ âîîáùå.Òàêèå èíòåðôåéñû ñëóæàò äëÿ öåëåé êîìïèëÿòîðà, òî åñòü ïðîãðàììèñò íå ìîæåò ñàì îïðåäåëÿòü òàêèå èíòåðôåéñû. Ïðèìåð - èíòåðôåéñìàðêåð Cloneable.146Òàêèå èíòåðôåéñû òðåáóåò ïîääåðæêó íåêîòîðûõ îïðåäåëåííûõ ìåòîäîâ â êëàññå. Ñ++ ÿâíîå ïîíÿòèå èíòåðôåéñà íå òðåáóåòñÿ, òàê êàê îí ïîääåðæèâàåò ìíîæåñòâåííîå íàñëåäîâàíèå.  Ñ++ ÿâíàÿ èëè íåå ÿâíàÿ ðåàëèçàöèÿ èíòåðôåéñîâ?Ðàññìîòðèì òåïåðü ÿçûê C#.
Òàì åñòü ÿâíîå ïîíÿòèå èíòåðôåéñà,òàì ìîãóò ñîäåðæàòüñÿ îáúÿâëåíèÿ ìåòîäîâ, ñâîéñòâ, èíäåêñàòîðîâ.interfase Intf{void Insert (T x);int Counter {get ;}T this [int];event MyDelegate Ev;};Èíòåðôåéñ íå ðàçðåøàåò óêàçûâàòü â ñåáå îïåðàöèè ïðåîáðàçîâàíèÿòèïà, ïîòîìó ÷òî îí ÿâëÿåòñÿ ñòàòè÷åñêèì. Åñëè æå ìû ïðîãðàììèðóåìíà Ñ++, òî ìû ìîæåì ðàçðåøèòü èíòåðôåéñàì ñîäåðæàòü ÷ëåíû äàííûõ,êîãäà êàê â C# êàæäûé òàêîé ñëó÷àé òðåáóåòñÿ ÿâíî îãîâàðèâàòü.C# äîïóñêàåò îäíîâðåìåííî è ÿâíóþ è íå ÿâíóþ ðåàëèçàöèþ èíòåðôåéñîâ.ßâíàÿ - ïðîñòî ðåàëèçàöèÿ ïóáëè÷íîãî ìåòîäà (äëÿ êàæäîãî èíòåðôåéñà). Íåÿâíàÿ - îäíà ðåàëèçàöèÿ íà âñåõ.I1:IDrawable;I2:IDrawable;class X:I1, I2{public void Draw(){}};X x = new X();X.Draw ();((I1)X).Draw ();((I2)X).Draw ();classX:I1, I2{void I1.Draw () {...}void I2.Draw () {...}}147X x = new X();x.Draw ();//ErrorI1 i1 = (I1)x;i1.Draw ();//Ok I1.Draw ();I2 i2 = (I2)x;i2.Draw ();//Ok I2.Draw ();Çàìåòèì ÷òî â ÿâíîé ðåàëèçàöèè îòñóòñòâóåò ìîäèôèêàòîð, òî åñòüòàêóþ ðåàëèçàöèþ ìîæíî âûçûâàòü òîëüêî ïðè ïðèâåäåíèè èíòåðôåéñîâ.Ëèáî âîçìîæåí òàêîé âàðèàíòpublic void Draw()((I1)this).Draw ()Èíòåðôåéñ è âèðòóàëüíîñòü.
Îäíà èç çàäà÷ èíòåðôåéñà - îäèíàêîâàÿðàáîòà êîìïîíåíò, èõ ðåàëèçóþùèé. Åñëè â êëàññå ðåàëèçîâàí íåêîòîðûé ìåòîä èíòåðôåéñà, òî íàñëåäóþùèå ýòîò êëàññ êëàññû íå ìîãóò ïåðåîïðåäåëèòü ýòîò ìåòîä. Òàêèì îáðàçîì, èíòåðôåéñû â Ñ# îòëè÷àþòñÿîò àáñòðàêòíûõ êëàññîâ â Ñ++ (ñ òî÷êè çðåíèÿ íàñëåäîâàíèÿ).148.