лекции (2008) (by Kravets) (1160829), страница 17
Текст из файла (страница 17)
Ïðè ýòîì ýòî äîëæåíáûòü èìåííî ïåðâûì îïåðàòîðîì â êîíñòðóêòîðå, òàê êàê êîíñòðóêòîðcreate çàáèâàåò îáúåêò íóëÿìè. Äëÿ ïîëó÷åíèÿ ðàçìåðà îáúåêòà, createèñïîëüçóåò âèðòóàëüíóþ ôóíêöèþ ïîëó÷åíèÿ ðàçìåðà îáúåêòà.Âàæíî ÷òî èìÿ îáúåêòà íå èñïîëüçóåòñÿ, òî åñòü ïðè ñìåíå èìåíè íåòðåáóåòñÿ ïåðåïèñûâàòü íàñëåäóåìûé êëàññ. Delphi íåò àâòîìàòè÷åñêîé ñáîðêè ìóñîðà â îáùåì âèäå, íî ïðèðàáîòå ÷åðåç ñòàíäàðòíûå èíòåðôåéñû îíà ìîæåò áûòü.
Ýòî ïðèâîäèòê òîìó, ÷òî ïðîãðàììû íà Delphi Ïðîâîöèðóþò áîëüøîå ÷èñëó óòå÷åêïàìÿòè.var a: X;a := X.create;a := X.Create (1);a.Free; - íå äåñòðóêòîð, íî óíè÷íîæåíèå îáúåêòà, êîòîðûé ìîæåò âûçûâàòü äåñòðóêòîð.102Äåñòðóêòîð íå òðåáóåòñÿ ÿâíî âûçûâàòü ÿâíî, òàê êàê ôóíêöèÿ Freeíå òîëüêî âûçûâàåò äåñòðóêòîð, íî è âûçûâàåò ìåíåäæåð ïàìÿòè äëÿî÷èñòêè. Òàê êàê ôóíêöèÿ íå ìîæåò ìåíÿòü çíà÷åíèå self, òî âûçîâ Freeíå ìîæåò èíèöèàëèçèðîâàòü a := nil.Ñòàòè÷åñêèå îáúåêòû Ñ++ âñå ñòàòè÷åñêèå îáúåêòû ñîçäàþòñÿ äî âûçîâà ôóíêöèè main.Ýòî åäèíñòâåííîå ÷òî èçâåñòíî ïðî íåãî.X a(0);X b(1);Âñå ÷òî èçâåñòíî, ýòî òî ÷òî a è b áóäóò ñîçäàíû äî âûçîâà main èóäàëåíû ïîñëå âûõîäà èç íåå.
Íî ïîðÿäîê èõ âûçîâà íå îïðåäåëåí.  îáùåì ñëó÷àå Ñ++ íå äàåò ñïîñîáîâ óïðàâëåíèÿ ïðîöåññîâ èíèöèàëèçàöèèñòàòè÷åñêèõ äàííûõ, è òðåáóåòñÿ èçîáðåòàòü äóðãèå ñïîñîáû. C# è Java âñå íåñêîëüêî èíà÷å.  Java äëÿ îáúåêòà ìîãóò ñòîÿòüèíèöèàëèçàòîðû.class X{static Y a = new Y ();}//Javaclass X{static int []a;static {a = new int [N];for (int i = 0; i < N; i ++) a[i] = i;}} C# åñòü âîçìîæíîñòü ïðîñòîé ñòàòè÷åñêîé èíèöèàëèçàöèè, à òàêæå åñòü ñòàòè÷åñêèé êîíñòðóêòîð - ïîëíûé àíàëîã ñòàòè÷åñêîãî áëîêà âJava.
Ïðè ýòîì ýòî äîëæåí áûòü êîíñòðóêòîðîì ïî óìîë÷àíèþ. Delphi ñòàòè÷åñêèé îáúåêòîâ âîîáùå íåò. Íî â interface ìîæíî îïèñàòü íå òîëüêî ìåòîäû.Òàê æå ó êàæäîãî ìîäóëÿ ïðèñóòñòâóåò èíèöèàëèçàöèîííàÿ è ôèíàëèçèðóþøùàÿ ÷àñòü, êîòîðûå âûïîëÿíþòñÿ ñîîòâåñòâåííî ïðè âõîäå èâûõîäÿ èç ìîäóëÿ. Ñ++ íå ñáîðêè ìóñîðà, â åãî ðåàëèçàöèè â ñèñòåìå .NET îíà ïðèñóòñòâóåò, íî â ñòàíäàðòå åãî íåò. Âûçîâ êîíñòðóòêðà îáÿçàòåëüíî ïðèâÿçûâàåòñÿ ê èíèöèàëèçàöèè è âûçîâ äåñòðóêòîðà - ê óäàëåíèþ.103Âàæíàÿ ÷åðòà Ñ++ - ñâåðòêà ñòåêà, ÷òî ãàðàíòèðóåò âûçîâ äåñòðóêòîðîâ äëÿ ëîêàëüíûõ îáúåêòîâ.RAII - Ïðèîáðåòåíèå ðåñóðñà is initialisationÅñëè êëàññ çàõâàòûâàåò ðåñóðñû - òî êîíñòðóêòîð - ýòî çàõâàò, äåñòðóêòîð - îñâîáîæäåíèå.  Ñ++ åäèíñòâåííàÿ âîçìîæíîñòü óòå÷êè ïàìÿòè - ðàáîòà ñ äèíàìè÷åñêîé ïàìÿòè. C# è Java åñòü ñáîðêà ìóñîðà, íî äëÿ íåå íåò óíèâåðñàëüíîãî ýôôåêòèâíîãî àëãîðèòìà. Ïåðâûé âàðèàíò àëãîðèòìà - ñ÷åò÷èê ññûëîê.Òàêàÿ ìåòîäèêà î÷åíü ïðîñòà, íî îíà íåêîððåêòíî ðàáîòàåò íà êîëüöåâûõ ññûëêàõ.Äðóãàÿ ìåòîäèêà - Mark And Sweep.
Åãî íåäîñòàòîê - âîçìîæíà âíåçàïíîå íåóïðàâëÿåìîå çàìåäëåíèå ïðîãðàììû (â ëþáîé ìîìåíò ìîæåòâêëþ÷èòüñÿ ñáîðêà ìóñîðà). Ñ++ ïðîáëåìà ïðè ðàáîòå ñ ïàìÿòüþ - ôðàãìåíòèðîâàíèå ïàìÿòè.M&S ïîçâîëÿåò èçáåæàòü ôðàãìåíòàöèè, íî îí ìåíÿåò àäðåñ îáúåêòà.Íîýòî íå åäèíñòàâåííàÿ ïðîáëåìà ýòîãî àëãîðèòìà.  C# è Java âûçîâäåñòðóêòîðà âîîáùå íå ãàðàíòèðîâàí, òàê êàê îí âûçûâàåòñÿ òîëüêî ïðèóíè÷òîæåíèè îáúåêòà, òî åñòü êîãäà íå õâàòàåò äèíàìè÷åñêîé ïàìÿòè.Ñáîðêà ìóñîðà íå ïîçâîëÿåò ÿâíî êîíòðîëèðîâàòü î÷èñòêó ðåñóðñîâ. êëàññå object åñòü protected ìåòîäprotected void nalise ();Ñåé÷àñ ñáîðêà ìóñîðà - ïàðàëëåëüíûé ïîòîê ñ íèçêèì ïðèîðèòåòîì.if (!close) closed ();Òàê äîëæåí âûãëÿäåòü ìåòîä nalise. Ñ# âñå åùå õóæå.  Ñ# ïîçâîëÿåòñÿ ïèñàòü äåñòðóêòîð, ïðè÷åìñèíòàêñèñ åãî òî÷íî òàêîé æå êàê è â Ñ++, íî ðàáîòàåò îí íå òàê. Âäåñòðóêòîðå âûçûâàåòñÿ ìåòîä ìåòîä nalise êëàññà object.
Òî åñòü äåñòðóêòîðÿ ïî ñóòè ÿâëÿåòñÿ òåì æå ôèíàëèçàòîðîì. Java ìåòîä î÷èñòêè ðåñóðñîâ ëèáî âûçûâàåòñÿ ÿâíî, ëèáî â ôèíàëèçàòîðå.c = new X();// çàõâàò ðåñóðñàtry {return;}finally {c.close ();//î÷èñòêà ðåñóðñîâ}104Ïðè ýòîì nally - ýòî íå ëîâóøêà. Ñ# ââåëè âïåöèàëüíûé èíòåðôåéñ - IDisposible, êîòîðûé ñîñòîèòèç åäèíîãî ìåòîäà void Dispose (), êîòîðûé ãîâîðèò, ÷òî îáúåêò íå îáÿçàòåëüíî ôèíàëèçèðîâàòü, çàìåùàÿ ñîáîé ôèíàëèçàöèþ.using ( Image im = Imaj.FromFile ()){//...}Òåïåðü ïîñëå using áëîêà âûçîâóòñÿ ìåòîäû dispose äëÿ âñåõ îáúåêòîâ èçusing áëîêà (êîòîðûé (Image im = Imaj.FromFile ())) Java åñòü äâà âèäà ññûëîê. Ñèëüíàÿ ññûëêà - îáû÷íàÿ ññûëêà, ñëàáàÿ ññûëêà:WeakReferenceObject getReference ();Ñëàáûå ññûëêè - ññûëêè íà óæå îñâîáîæäåííóþ ïàìÿòü ñ òî÷êè çðåíèÿ ïðîãðàììèñòà, íî ïàìÿòü åùå íå îñâîáîæäåíà.
getReference äëÿ ñëàáîé ññûëêè "ðåàíèìèðóåò"îáúåêò.Ïðèìåð - êåø áðîóçåðà, ïðè ïåðåõîäå íà ñëåä ñòðàíèöó òðåáóåòñÿîñâîáîäèòü êåø áðîóçåðà. Ññûëêàì íà íèõ ïðèñâàèâàþòñÿ íóëè è îíèïåðåõîäÿò â ðàçðÿä ñëàáûõ ññûëîê. Åñëè âåðíóòüñÿ íàçàä, òî âìåñòî çàïðàøèâàèÿ ðåñóðñîâ ïîâòîðíî ìîæíî ðàññìîòðåòü î÷åðåäü ñëàáûõ ññûëîê è ïîïðîáîâàòü äîñòàòü îáúåêòû.
Åñëè îáúåêò íåäîñòóïåí, òî ïðîñòîâåðíåòñÿ null.Èòàê, ìû ïîëó÷àåì ìåõàíèçì êåøèðîâàíèÿ ðåñóðñîâ.Ïóíêò 4. Äîïîëíèòåëüíûå ïðîáëåìû, ñâÿçàííûå ñ òèïàìè.- êîïèðîâàíèå, ñðàâíåíèå- íåÿâíûå ïðåîáðàçîâàíèÿÏðîáëåìà êîïèðîâàíèÿ è ñðàâíåíèÿ îáúåêòà - ìîãóò îòëè÷àòüñÿ îòñòàíäàðòíûõ îïåðàöèé êîïèðîâàíèÿ èëè ñðàâíåíèÿ. Êàê ñðàâíèâàòü èìîæíî ëè îãðàíè÷èòüñÿ ïðîñòûì ïî÷ëåííûì êîïèðîâàíèåì. Îòñþäà 2ïîíÿòèÿ - ãëóáîêîå êîïèðîâàíèå è ïîâåðõíîñòíîå êîïèðîâàíèå. Deep copyè shallow copy.Íà âîïðîñ î òîì, êàê èìåííî êîïèðîâàòü ìîæåò îòâåòèòü òîëüêî ïðîãðàììèñò.  Ñ++ ñòàíäàðòíîå - ïîâåðõíîñòíîå êîïèðîâàíèå.
 äðóãèõÿçûêàõ ñòàíäàðòíîå ïðèñâàèâàíèå - ïîâåðõíîñòíîå êîïèðîâàíèå.  C# è105Java åñòü ìåòîäû clone ().  îáîèõ ÿçûêàõ åñòü ñïåöèàëüíûé èíòåðôåéñIcloneable.Ñ Ñ# â êëàññå Object åñòü ìåòîä MemberwiseClone (), ðåàëèçóþùèéïîâåðõíîñòíîå ïî÷ëåííîå êîïèðîâàíèå, ÷òîá èçáåæàòü ýòîãî îáúåêò äîëæåí ðåàëèçîâûâàòü èíòåðôåéñ ICloneable, â êîòîðîì äîëæåí áûòü ìåòîäclone ().106Ëåêöèÿ 2425.11.2008Ðàññìîòðèì ÿçûê Delphi - òàì íàèáîëåå ïðîñòàÿ ñèòóàöèÿ.
Òàì íàñëåäóþòñÿ êîíñòðóêòîðû è äåñòðóêòîðû. Áîëåå òîãî, îíè âñåãäà âûçûâàþòñÿÿâíî, òî åñòü òàì íåò îñîáûõ ôîðì êîíñòðóêòîðîâ.type X = classconstructor load;destructor Destroy;end;Åñëè êîíñòðóêòîðîâ èëè äåñòðóêòîðîâ íåò, òî îíè íå ñîçäàþòñÿ. Òàêêàê êîíñòðóêòîðû íàñëåäóþòñÿ, òî âñå îáúåêòû èìåþò êîíñòðóêòîð createè äåñòðóêòîð destroy. Êîãäà âûçûâàåòñÿ êîíñòðóêòîð, ìû óâåðåíû ÷òîòàáëèöà âèðòóàëüíûõ ìåòîäîâ èìååò êîððåêòíûé âèä (â Ñ++ ýòî íå òàê).Èòàê êîíñòðóêòîðû è äåñòðóêòîðû íàñëåäóþòñÿ íî íå ãåíåðèðóþòñÿ.
Íèêàêèõ êîíñòðóêòîðîâ óìîë÷àíèÿ íåòó è äëÿ âûçîâà êîíñòðóêòîðàáàçîâîãî êëàññà òðåáóåòñÿ âûçûâàòü åãî ÿâíî. Äëÿ ýòîãî ñëóæèò ñïåöèàëüíîå êëþ÷åâîå ñëîâîinherited - Delphisuper - javabase - C# Delphi äëÿ âûçîâà êîíñòðóêòîðà áàçîâîãî êëàññà òðåáóåòñÿ ïåðâûìîïåðàòîðîì â îáúåêòå íàïèñàòü inherited Create. Ïðè ýòîì ýòî äîëæåíáûòü èìåííî ïåðâûì îïåðàòîðîì â êîíñòðóêòîðå, òàê êàê êîíñòðóêòîðcreate çàáèâàåò îáúåêò íóëÿìè. Äëÿ ïîëó÷åíèÿ ðàçìåðà îáúåêòà, createèñïîëüçóåò âèðòóàëüíóþ ôóíêöèþ ïîëó÷åíèÿ ðàçìåðà îáúåêòà.Âàæíî ÷òî èìÿ îáúåêòà íå èñïîëüçóåòñÿ, òî åñòü ïðè ñìåíå èìåíè íåòðåáóåòñÿ ïåðåïèñûâàòü íàñëåäóåìûé êëàññ. Delphi íåò àâòîìàòè÷åñêîé ñáîðêè ìóñîðà â îáùåì âèäå, íî ïðèðàáîòå ÷åðåç ñòàíäàðòíûå èíòåðôåéñû îíà ìîæåò áûòü. Ýòî ïðèâîäèòê òîìó, ÷òî ïðîãðàììû íà Delphi Ïðîâîöèðóþò áîëüøîå ÷èñëó óòå÷åêïàìÿòè.var a: X;a := X.create;a := X.Create (1);a.Free; - íå äåñòðóêòîð, íî óíè÷íîæåíèå îáúåêòà, êîòîðûé ìîæåò âûçûâàòü äåñòðóêòîð.107Äåñòðóêòîð íå òðåáóåòñÿ ÿâíî âûçûâàòü ÿâíî, òàê êàê ôóíêöèÿ Freeíå òîëüêî âûçûâàåò äåñòðóêòîð, íî è âûçûâàåò ìåíåäæåð ïàìÿòè äëÿî÷èñòêè.
Òàê êàê ôóíêöèÿ íå ìîæåò ìåíÿòü çíà÷åíèå self, òî âûçîâ Freeíå ìîæåò èíèöèàëèçèðîâàòü a := nil.Ñòàòè÷åñêèå îáúåêòû Ñ++ âñå ñòàòè÷åñêèå îáúåêòû ñîçäàþòñÿ äî âûçîâà ôóíêöèè main.Ýòî åäèíñòâåííîå ÷òî èçâåñòíî ïðî íåãî.X a(0);X b(1);Âñå ÷òî èçâåñòíî, ýòî òî ÷òî a è b áóäóò ñîçäàíû äî âûçîâà main èóäàëåíû ïîñëå âûõîäà èç íåå. Íî ïîðÿäîê èõ âûçîâà íå îïðåäåëåí.  îáùåì ñëó÷àå Ñ++ íå äàåò ñïîñîáîâ óïðàâëåíèÿ ïðîöåññîâ èíèöèàëèçàöèèñòàòè÷åñêèõ äàííûõ, è òðåáóåòñÿ èçîáðåòàòü äóðãèå ñïîñîáû. C# è Java âñå íåñêîëüêî èíà÷å.  Java äëÿ îáúåêòà ìîãóò ñòîÿòüèíèöèàëèçàòîðû.class X{static Y a = new Y ();}//Javaclass X{static int []a;static {a = new int [N];for (int i = 0; i < N; i ++) a[i] = i;}} C# åñòü âîçìîæíîñòü ïðîñòîé ñòàòè÷åñêîé èíèöèàëèçàöèè, à òàêæå åñòü ñòàòè÷åñêèé êîíñòðóêòîð - ïîëíûé àíàëîã ñòàòè÷åñêîãî áëîêà âJava.
Ïðè ýòîì ýòî äîëæåí áûòü êîíñòðóêòîðîì ïî óìîë÷àíèþ. Delphi ñòàòè÷åñêèé îáúåêòîâ âîîáùå íåò. Íî â interface ìîæíî îïèñàòü íå òîëüêî ìåòîäû.Òàê æå ó êàæäîãî ìîäóëÿ ïðèñóòñòâóåò èíèöèàëèçàöèîííàÿ è ôèíàëèçèðóþøùàÿ ÷àñòü, êîòîðûå âûïîëÿíþòñÿ ñîîòâåñòâåííî ïðè âõîäå èâûõîäÿ èç ìîäóëÿ. Ñ++ íå ñáîðêè ìóñîðà, â åãî ðåàëèçàöèè â ñèñòåìå .NET îíà ïðèñóòñòâóåò, íî â ñòàíäàðòå åãî íåò.