Bolączki C++ #4 – Właściwości

2007-09-29 13:14

W teorii OOPu klasa może składać się wielu różnych rodzajów elementów. Mamy więc pola, metody, właściwości, operatory, typy, zdarzenia czy nawet sygnały (cokolwiek to oznacza). Z drugiej reprezentacja obiektu w pamięci operacyjnej działającego programu to niemal wyłącznie wartości jego pól (z drobną poprawką na ewentualną tablicę metod wirtualnych).
To są dwie skrajności, a między nimi mam wszystkie obiektowe języki programowania. Jedne oferują w tym zakresie więcej, inne mniej. Weźmy na przykład C++.

Oprócz niezbędnych pól i metod pozwala on definiować przeciążone operatory i typy wewnętrzne. Nie posiada za to niezwykle przyjemnego “cukierka składniowego”, czyli właściwości. Z punktu widzenia programisty właściwości to takie elementy interfejsu klasy, który wyglądają jak pola. Różnica polega na tym, że dostęp do właściwości nie musi oznaczać bezpośredniego odwołania do pamięci, lecz może mu towarzyszyć dodatkowy kod – na przykład sprawdzający poprawność ustawianej wartości.
Prawdopodobnie najbardziej elastyczny mechanizm właściwości wśród popularnych języków programowania ma C#. Tam kod wykonywany przy pobieraniu i ustawianiu właściwości pisze się bezpośrednio w jej deklaracji:

  1. class Fraction
  2. {
  3.    private int num;
  4.    private int denom;
  5.  
  6.    // właściwość - mianownik ułamka
  7.    public int Denominator
  8.    {
  9.       get { return denom; }
  10.       set
  11.       {
  12.          if (value == 0)   throw new DivideByZeroException();
  13.          denom = Math.Abs(value);
  14.          num *= Math.Sign(value);
  15.       }
  16.    }
  17. }

Nieco gorzej jest w Delphi czy Visual C++, gdzie istnieje deklaracja __declspec(property). Tam trzeba napisać odpowiednie metody służące pobieraniu/ustawianiu danej wartości (akcesory) i wskazać je w deklaracji właściwości.
Natomiast w czystym C++ rzeczone akcesory – metody Get/Set – stosowane bezpośrednio są jedynym wyjściem. Niezbyt ładnym rzecz jasna.

Bez właściwości można się obyć, a ich wprowadzenie do języka pewnie nie byłoby takie proste. Pomyślmy na przykład, jak miałyby się one do wskaźników i referencji: o ile pobranie adresu właściwości nie ma sensu, o tyle przekazywanie jej przez referencję byłoby z pewnością przydatne.
Dlatego chociaż akcesory wyglądają brzydko, pewnie jest przez długi czas będą jedyną opcją. Na pocieszenie dodam, że programiści Javy są pod tym względem w identycznej sytuacji :)

Tags: , ,
Author: Xion, posted under Programming »


3 comments for post “Bolączki C++ #4 – Właściwości”.
  1. SirMike:
    September 29th, 2007 o 19:42

    O ile dobrze pamietam to w Java 6 sa juz wlasciwosci :P

  2. Xion:
    October 2nd, 2007 o 19:11

    Pierwsze słyszę :) Może chodziło ci o klasę java.util.Properties, ale to nic innego jak prosta polimorficzna mapa kluczowana napisami.

  3. Liosan:
    October 5th, 2007 o 22:40

    O ile dobrze pamiętam, w ostatnim Delphi na którym pracowałem (bodajże Turbo) property działał bez zarzutu :)

    property Wartosc: integer read: GetWartosc() write SetWartosc(a: integer);

    [mogłem zgubić jakaś interpunkcję]

Comments are disabled.
 


© 2018 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.