Objektově orientované programování - doplňky

Paul Vick, Microsoft Corporation
Pro potřeby výuky v českém prostředí vybral a přeložil Vladimír Homola

Anotace

Článek si klade za cíl doplnit a upřesnit některé pojmy uvedené v článku Objektově orientované programování (viz).

1. Namespace (jmenný prostor, prostor jmen)

Program psaný v jazyku Basic, verze z Visual Studia .NET a následujících,  je vytvořen z pojmenovaných entit. Tyto entity jsou zavedeny prostřednictvím deklarací a reprezentují vlastní algoritmus programu a jeho pracovní objekty.

Namespace (doslova prostor jmen) je ta entita na vrcholové úrovni, která organizuje jiné entity, jako jsou vnořené prostory jmen a typy.

Typy jsou entity, které popisují hodnoty a definují vykonatelný kód. Typy mohou obsahovat vnořené typy (nested types) a členy typu (type members). Člen typu je

Entita, která může obsahovat jiné entity, definuje deklarační prostor. Entity jsou do deklaračního prostoru zaváděny buď deklarací nebo děděním; entity obsahující deklarační prostor je označován jako deklarační kontext těchto entit. Deklarování entity v deklaračním prostoru střídavě (in turn) definuje nový deklarační prostor, který může obsahovat další vnořenou deklaraci entity. Takto tedy deklarace v programu vytvářejí hierarchii deklaračních prostorů.

S výjimkou překrývaných (overloaded) členů typu, nemůže deklarace zavádět identicky pojmenované entity stejného druhu ve stejném deklaračním kontextu. Navíc deklarační prostor nemůže nikdy obsahovat ani různé druhy entit se stejným jménem (například proměnnou a metodu).

Deklarační prostor jmenného prostoru je s "otevřeným koncem" - dvě deklarace jmenného prostoru se dvěmi stejnými úplně kvalifikovanými jmény přispívají do stejného deklaračního prostoru. V následujícím příkladu dvě deklarace jmenného prostoru přispívají do stejného deklaračního prostoru, zde deklarováním dvou jmen s úplnou kvalifikací Utrata.Vydaje a Utrata.Obchody:

 

Namespace Utrata
   Class Vydaje
      ...
   End Class
End Namespace
...
Namespace Utrata
   Class Obchody
      ...
   End Class
End Namespace
...

2. Přetěžování (overloading) a signatury

Jediný způsob, jak deklarovat entity stejného druhu s identickými jmény je tzv. přetěžováním (overloading). Ovšem přetěžovány mohou být pouze metody, operátory, instance konstruktorů a vlastnosti.

Přetěžovaný člen třídy musí však mít jedinečnou signaturu. Signatura sestává z

Následující konstrukce nejsou členy signatury a proto je nelze použít při přetěžování:

Následující tabulka ukazuje příklady přetěžovaných metod A spolu s jejich signaturami. Tyto deklarace se ovšem nemohou vyskytnout současně ve stejném deklaračním kontextu, protože některé z metod mají identické signatury.

 

Deklarace metody Signatura
Sub A () A ()
Sub A (p As Byte) A (Byte)
Sub A (ByRef p As Byte) A (Byte)
Sub A (p As Long, q As Long) A (Long, Long)
Function A (p As String) As Byte A (String)
Function A (p As Byte) As String A (Byte)
Sub A ( p() As Byte) A ( Byte() )
Sub A ( ParamArray ByVal p() As Byte ) A ( Byte() )

 

Metoda s volitelnými parametry má několik signatur - jednu pro každou množinu parametrů, se kterou může být metoda volána:

 

Deklarace metody Signatura
Sub A ( p As Byte, Optional q As Long, Optional r As String ) A ( Byte )
A ( Byte, Long )
A ( Byte, Long, String )

 

3. Oblast platnosti (scope)

Oblast platnosti jména entity je množina všech deklaračních prostorů, ve kterém může být na jméno odkazováno bez kvalifikace. Obvykle je oblastí platnosti entity celý její deklarační kontext. Ovšem deklarace entity může obsahovat vnořenou deklaraci entity se stejným jménem. V takovém případě vnořená entita zastiňuje (shadows) vnější entitu. K vnější entitě je z oblasti platnosti vnitřní entity přístup jen použitím kvalifikace.

4. Jména typů a jmenných prostorů, kvalifikace

Mnoho jazykových konstrukcí vyžaduje specifikaci typu nebo jmenného prostoru. Tyto entity mohou být specifikovány použitím kvalifikovaného jména typu nebo kvalifikovaného jména jmenného prostoru. Kvalifikované jméno sestává z posloupnosti identifikátorů oddělených tečkou. Identifikátor vpravo od tečky je řešen v rámci deklaračního prostoru specifikovaného identifikátorem na levé straně tečky.

Úplně kvalifikované jméno jmenného prostoru nebo typu je takové kvalifikované jméno, které obsahuje jména všech nadřazených jmenných prostorů nebo typů. Jinak řečeno, úplně kvalifikované jméno entity je tvaru N.T, kde T je jméno entity a N je úplně kvalifikované jméno entity obsahující entitu T.

Následující tabulka obsahuje příklad několika jmenných prostorů a deklarací typů spolu s jejich úplně kvalifikovanými jmény:

 

Deklarace Úplně kvalifikované jméno
Class A
End Class
A .
  
Namespace X
      Class B
         Class C
         End Class
      End Class
  
      Namespace Y
         Class D
         End Class
      End Namespace
End Namespace
X .
X . B .
X . B . C .
  
  
  
 X . Y . 
 X . Y . D .
  
  
    
Namespace X . Y
      Class E
      End Class
End Namespace
X . Y .
X . Y . E .
  
  

 

V textu programu definované jmenné prostory jsou pro účely sestavení cílové aplikace považovány za vnořené do globálního jmenného prostoru, který obsahuje definici entit nazývaných mnohdy programátory jako "standardní" - viz standardní typ Long apod. Ovšem i v tomto globálním prostoru jsou pojmenované entity a programem definovaná entita je může zastínit. Pro specifikaci tohoto globálního jmenného prostoru je vyhrazeno klíčové slovo Global. Jeho použití může ukázat následující příklad:

 

Class System
End Class

Module A
   Sub Main ()
      Dim P As System.Long                ' Chyba: třída System neobsahuje Long
      Dim Q As Global.System.Long         ' Správně: odkazuje na System v globálním jmenném prostoru
   End Sub
End Module

 

Je-li dáno kvalifikované jméno ve tvaru N . R, kde R je nejvíce vpravo stojící identifikátor, postupuje se při určení odkazovaného jmenného prostoru nebo typu jménem N.R takto:

 

 

Literatura

[1] VICK, Paul: The Microsoft Visual Basic Language Specification. Version 8, 9, 10. Microsoft Corporation 2005 - 2011.

 

 

Rev. 03 / 2011