Visual Basic zblφzka D∞diΦnost a rozhranφ Dnes si povφme n∞co o d∞diΦnosti a rozhranφch. Visual Basic neobsahuje p°φmo podporovanou d∞diΦnost. Bez tΘto mo₧nosti se sice dß v objektovΘm programovßnφ obejφt, ale znemo₧nφ nßm to elegantnφ znovupou₧itφ ji₧ existujφcφ funkΦnosti. Samoz°ejm∞ toto lze provΘst i jin²mi zp∙soby. Prvnφ, s pomocφ kterΘho m∙₧eme p°edstφrat d∞diΦnost, funguje tak, ₧e uvnit° t°φdy vytvo°φme instanci d∞d∞nΘho objektu a vytvo°φme metody, vlastnosti a udßlosti se stejn²mi jmΘny v odvozenΘm objektu, p°iΦem₧ v k≤du p°esm∞rujeme volßnφ metod na vlo₧en² objekt. Kdy₧ pomineme pracnost, je velkou nev²hodou tohoto zp∙sobu, ₧e p°i n∞m VB nebude mφt nejmenÜφ pon∞tφ o tom, ₧e v²slednß t°φda je odvozenß od jinΘ a tφm pßdem dosßhneme polymorfizmu pouze na ·rovni typu MΘn∞ pracn²m zp∙sobem, jak²m lze znovupou₧φt existujφcφ funkΦnost je agregace. Ta spoΦφvß v tom, ₧e s pomocφ vlastnosti vyvedeme odkaz na objekt, jeho₧ funkΦnost chceme vyu₧φt, ven z vytvß°enΘ t°φdy. ProblΘmem ovÜem je, ₧e VB agregaci nepodporuje. Vy sice zve°ejnφte objekt s pomocφ vlastnosti, ale p°i jeho pou₧φvßnφ mohou nastat nekonsistentnφ situace. Vytvß°φ-li n∞jak² objekt uvnit° sebe objekt jin², je logickΘ, ₧e ₧ivotnost vnit°nφho objektu je bezprost°edn∞ zßvislß na objektu vn∞jÜφm. Zanikne-li objekt vn∞jÜφ zaniknou i vÜechny vnit°nφ. Toto ovÜem VB nezvlßdne. Jestli₧e vytvo°φte takov²to objekt a s pomocφ vlastnosti zφskßte odkaz na vnit°nφ objekt a potΘ odstranφte vÜechny odkazy na objekt vn∞jÜφ, vyvolßte tφm jeho destrukci. Ale jeliko₧ existuje odkaz na vnit°nφ objekt, tak ten stßle existuje, aΦkoli objekt, kter² ho vytvo°il a jeho₧ neodd∞litelnou souΦßstφ by m∞l b²t, je ji₧ v k°emφkovΘm nebi. Ptßte se proΦ je tomu tak? Je to prostΘ, podle pravidel, kterß jsme si uvedli v prvnφm dφle vÜe funguje tak jak mß. OvÜem tato pravidla pro uveden² zp∙sob nejsou vhodnß. Aby uveden² zp∙sob fungoval, musφ pro objekt vn∞jÜφ a vÜechny vnit°nφ existovat pouze jedno poΦφtadlo, tak₧e dokud existuje odkaz na objekt vn∞jÜφ nebo na libovoln² objekt vnit°nφ, neprob∞hne destrukce ani jednoho z nich. Jednou ze zajφmav²ch mo₧nostφ, kterΘ VB nabφzφ je mo₧nost implementovat objektu r∙znß rozhranφ. Co si pod tφm m∙₧ete p°edstavit? Rozhranφ je mno₧ina metod a vlastnostφ, kterΘ urΦujφ zp∙sob komunikace s objektem. Ka₧d² objekt jich m∙₧e mφt nepoΦφtan∞ a zßvisφ jen na vßs, kterΘ se nßsledn∞ rozhodnete pou₧φvat, a¥ u₧ implicitnφ nebo jinΘ. M∙₧e existovat n∞kolik odkaz∙ na objekt, p°iΦem₧ ka₧dΘ pracuje s jin²m rozhranφm ale, se stejnou instancφ objektu. Ve VB se s rozhranφmi pracuje nßsledovn∞. Vytvo°φte abstraktnφ (obsahujφcφ pouze deklaraci metod) t°φdu, i kdy₧ nemusφ b²t nutn∞ abstraktnφ, jejφ₧ metody a vlastnosti budou p°edstavovat jednotlivΘ Φßsti rozhranφ. Vlo₧te dv∞ t°φdy s nßzvy
'abstraktnφ t°φda rozhranφ ICzech Public Property Get MojeVlastnost() As String End Property Public Property Let MojeVlastnost(Value As String) End Property Public Function MojeMetoda() As String End Function Public Function MojeMetodaEN() As String End Function 'abstraktnφ t°φda rozhranφ IEnglish Public Property Get MyProperty() As String End Property Public Property Let MyProperty(Value As String) End Property Public Function MyMethod() As String End Function Public Function MyMethodCZ() As String End Function Nynφ mßme vytvo°ena rozhranφ, tak se pustφme do jejich implementace do t°φdy, kterß je bude vyu₧φvat. Vlo₧te novou t°φdu a nazv∞te ji
Implements ICzech Implements IEnglish Private mCZVar As String Private mENVar As String Private Function ICzech_MojeMetoda() As String ICzech_MojeMetoda = "Toto je tv∙j °et∞zec: " & mCZVar End Function Private Function ICzech_MojeMetodaEN() As String ICzech_MojeMetodaEN = "Toto je tv∙j anglick² °et∞zec: " & mENVar End Function Private Property Let ICzech_MojeVlastnost(Value As String) mCZVar = Value End Property Private Property Get ICzech_MojeVlastnost() As String ICzech_MojeVlastnost = mCZVar End Property Private Function IEnglish_MyMethod() As String IEnglish_MyMethod = "This is your string: " & mENVar End Function Private Function IEnglish_MyMethodCZ() As String IEnglish_MyMethodCZ = "This is your czech string: " & mCZVar End Function Private Property Let IEnglish_MyProperty(Value As String) mENVar = Value End Property Private Property Get IEnglish_MyProperty() As String IEnglish_MyProperty = mENVar End Property A nynφ si vytvo°φme aplikaci, na kterΘ si budeme ilustrovat pou₧itφ naÜich rozhranφ a t°φdy. Vlo₧te na formulß° t°i tlaΦφtka a do vlastnsti Uvedeme si prvnφ p°φklad. Vn∞m do prom∞nnΘ typu
Private Sub Command1_Click() Dim cz As ICzech Set cz = New MyClass cz.MojeVlastnost = Text1.Text MsgBox cz.MojeMetoda, vbOKOnly, "cz.MojeMetoda" End SubDruh² p°φklad bude provßd∞t to samΘ, ale stφm rozdφlem, ₧e bude vyu₧φvat rozhranφ IEnglish .
Private Sub Command2_Click() Dim en As IEnglish Set en = New MyClass en.MyProperty = Text2.Text MsgBox en.MyMethod, vbOKOnly, "en.MyMethod" End Sub V poslednφm p°φkladu si ilustrujeme, ₧e kdy₧ nadeklarujete prom∞nnou urΦitΘho typu (rozhranφ), bude v₧dy pou₧φvat stßle stejnΘ rozhranφ bez ohledu na to, z jakΘho typu (rozhranφ) je mu odkaz na objekt p°i°azen. Navφc je ilustrovßno, ₧e implementovanß rozhranφ mohou pou₧φvat stejnΘ prost°edky, Φili prost°edky, kterΘ mß t°φda, je₧ je implementuje.
Private Sub Command3_Click() Dim cz As ICzech Dim en As IEnglish Dim mc As MyClass 'vytvo°φ instanci MyClass Set mc = New MyClass 'P°i°adφ se instance MyClass do prom∞nnΘ, 'kterß se odkazuje na ΦeskΘ rozhranφ Set cz = mc 'P°i°adφ se instance MyClass do prom∞nnΘ, 'kterß se odkazuje na anglickΘ rozhranφ Set en = mc 'VÜechny prom∞nnΘ (mc, en, cz) se odkazujφ 'na stejnou instanci, ale na rozdφlnß rozhranφ en.MyProperty = Text2.Text cz.MojeVlastnost = Text1.Text '╚eskΘ rozhranφ vypφÜe Φesk² °et∞zec MsgBox cz.MojeMetoda, vbOKOnly, "cz.MojeMetoda" '╚eskΘ rozhranφ vypφÜe anglick² °et∞zec MsgBox cz.MojeMetodaEN, vbOKOnly, "cz.MojeMetodaEN" 'AnglickΘ rozhranφ vypφÜe anglick² °et∞zec MsgBox en.MyMethod, vbOKOnly, "en.MyProperty" 'AnglickΘ rozhranφ vypφÜe Φesk² °et∞zec MsgBox en.MyMethodCZ, vbOKOnly, "en.MyPropertyCZ" 'p°i°adφ se okaz na objekt z jinΘho rozhranφ, 'ale stßle se bude pracovat s anglick²m Set en = cz 'AnglickΘ rozhranφ op∞t vypφÜe anglick² °et∞zec MsgBox en.MyMethod, vbOKOnly, "en.MyProperty" 'AnglickΘ rozhranφ op∞t vypφÜe Φesk² °et∞zec MsgBox en.MyMethodCZ, vbOKOnly, "en.MyPropertyCZ" End Sub R∙znß rozhranφ vßm umo₧nφ bu∩ odd∞lit jednotlivΘ Φßsti funkΦnosti objektu nebo pracovat s objektem r∙zn²mi zp∙soby. Uveden² p°φklad m∙₧ete nalΘzt zde. |