лекции (2008) (by Kravets) (укороченное) (1160827), страница 22
Текст из файла (страница 22)
 òàêîì ñëó÷àå òðåáóåòñÿ,÷òîá íàñëåäóþùèé êëàññ ñîäåðæàë â ñåáå óäàëåíèå îáúåêòà - èíòåðôåéñà.Äðóãîé âàðèàíò èñïîëüçîâàíèå òàêîãî - çàïðåò íà óäàëåíèå îáúåêòîâ - èíòåðôåéñîâ. òåõíîëîãèè COM èíòåðôåéñû - âñåãäà ÷èñòî àáñòðàêòíûé êëàññ. Ýòà òåõíîëîãèÿ ïîäðàçóìåâàåò èñïîëüçîâàíèå ñàìûõ ðàçíûõ êîíòåêñòîâ âûïîëíåíèÿ (â îòëè÷èè îò .NET), òî åñòü çíàòü êàê óíè÷òîæèòü îáúåêòìîæåò çíàòü òîëüêî ñàì îáúåêò.class 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{....};89Ïðè ýòîì ìû âñåãäà ìîæåò çàìåíèòü SList íà BitScale, ïðè÷åì ïîòðåáóåòñÿ òîëüêî ïåðåòðàíñëèðîâàòüìîäóëü.Èíòåðôåéñû â ÿçûêå JavaInterface IDrawable{void Draw ();static int final SomeConst = 1;} èíòåðôåéñå ìîãóò ñîäåðæàòüñÿ òîëüêî îáúÿâëåíèÿ ìåòîäîâ, à òàê æå ñòàòè÷åñêèõ ÷ëåíîâ è êîíñòàíò. Ïîóìîë÷àíèþ âñå èíòåðôåéñû èìåþò ïðàâèëî âèäèìîñòè public.Åñëè êëàññ íàñëåäóåò íåêîòîðûé èíòåðôåéñ, òî îí äîëæåí ëèáî ðåàëèçîâàòü âñå ìåòîäû äàííîãî èíòåðôåéñà, ëèáî áûòü àáñòðàêòíûì.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.Òàêèå èíòåðôåéñû òðåáóåò ïîääåðæêó íåêîòîðûõ îïðåäåëåííûõ ìåòîäîâ â êëàññå. Ñ++ ÿâíîå ïîíÿòèå èíòåðôåéñà íå òðåáóåòñÿ, òàê êàê îí ïîääåðæèâàåò ìíîæåñòâåííîå íàñëåäîâàíèå. Ñ++ ÿâíàÿ èëè íåå ÿâíàÿ ðåàëèçàöèÿ èíòåðôåéñîâ?Ðàññìîòðèì òåïåðü ÿçûê C#. Òàì åñòü ÿâíîå ïîíÿòèå èíòåðôåéñà, òàì ìîãóò ñîäåðæàòüñÿ îáúÿâëåíèÿìåòîäîâ, ñâîéñòâ, èíäåêñàòîðîâ.interfase Intf{void Insert (T x);int Counter {get ;}T this [int];event MyDelegate Ev;};90Èíòåðôåéñ íå ðàçðåøàåò óêàçûâàòü â ñåáå îïåðàöèè ïðåîáðàçîâàíèÿ òèïà, ïîòîìó ÷òî îí ÿâëÿåòñÿ ñòàòè÷åñêèì. Åñëè æå ìû ïðîãðàììèðóåì íà Ñ++, òî ìû ìîæåì ðàçðåøèòü èíòåðôåéñàì ñîäåðæàòü ÷ëåíûäàííûõ, êîãäà êàê â 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 () {...}}X 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 ()Èíòåðôåéñ è âèðòóàëüíîñòü. Îäíà èç çàäà÷ èíòåðôåéñà - îäèíàêîâàÿ ðàáîòà êîìïîíåíò, èõ ðåàëèçóþùèé.
Åñëè â êëàññå ðåàëèçîâàí íåêîòîðûé ìåòîä èíòåðôåéñà, òî íàñëåäóþùèå ýòîò êëàññ êëàññû íå ìîãóòïåðåîïðåäåëèòü ýòîò ìåòîä. Òàêèì îáðàçîì, èíòåðôåéñû â Ñ# îòëè÷àþòñÿ îò àáñòðàêòíûõ êëàññîâ â Ñ++(ñ òî÷êè çðåíèÿ íàñëåäîâàíèÿ).91.