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 Object.

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 ICzech a IEnglish a vlo₧te do nich nßsledujφcφ k≤d, kter² bude p°edstavovat jednotlivΘ Φleny rozhranφ. V t∞chto t°φdßch nemusφ b²t ₧ßdn² k≤d.

'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 MyClass. Pomocφ klφΦovΘho slova Implements t°φd∞ zd∞lφme, ₧e bude implementovat naÜe rozhranφ. JednotlivΘ Φleny rozhranφ se budou do t°φdy vklßdat ve form∞ nßzevrozhranφ_nßzevΦlena. Do takto vytvo°en²ch metod a vlastnostφ pak vlo₧φme samotn² k≤d. Ten je velice jednoduch². Nastavφte do vlastnosti °et∞zec a metodami pak zφskßte oznßmenφ, co se ve vlastnsti prßv∞ nachßzφ.

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 Caption, ve stejnΘm po°adφ v jakΘm jste jej vytvo°ili, vlo₧te popisky äCZô, äENô a äTestô. PotΘ vlo₧te dva TextBoxy, ze kter²ch bude nastavovat vlastnosti.

Uvedeme si prvnφ p°φklad. Vn∞m do prom∞nnΘ typu ICzech p°i°adφte novou instanci objektu MyClass. Ta pak bude pou₧φvat vlastnφ funΦnost, ale pouze rozhranφ vytvo°enΘ t°φdou ICzech.

Private Sub Command1_Click()
Dim cz As ICzech
  Set cz = New MyClass
  
  cz.MojeVlastnost = Text1.Text
  MsgBox cz.MojeMetoda, vbOKOnly, "cz.MojeMetoda"
End Sub

Druh² 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.