Przypuśćmy, że mamy klasę jakiegoś playera, który w jakiś niezwykle ciekawy sposób odtwarza dla nas pliki dźwiękowe. Jedną z jego zmiennych jest referencja do buffora (SndBuf) obsługującego plik dźwiękowy. Chcielibyśmy przygotować fajnego settera i gettera dla tej zmiennej. No to proszę:
public class Player
{
SndBuf _buffer;
// najpierw setter
fun SndBuf buffer( SndBuf buf )
{
// jakiś kod settera
}
// teraz getter
fun SndBuf buffer()
{
// jakiś kod gettera
}
}
Z dowolnego miejsca w programie możemy skorzystać z nich w następujący sposób:
SndBuf buf1, bu2; Player player; buf1 @=> player.buffer; player.buffer() @=> buf2;
Fajne, bo pozwala na korzystanie w obu przypadkach z jednej nazwy, która z jednej strony niewiele różni się od bezpośredniego odwołania do zmiennej, ale z drugiej strony pozwala na zachowanie zasad bezpieczeństwa dzięki setterom i getterom. Technika ta stosowana jest w ChucKu na każdym kroku.
Pytanie brzmi: Po co nam w setterze SndBuf, jako typ zwracanej wartości, skoro to setter?! ChucK jest bardzo zaskakującym językiem i okazuje się, że typ zwracanej wartości musi się zgadzać pomiędzy przeciążanymi funkcjami. Nie wiadomo, po co, bo przecież typ zwracany nie wchodzi de facto w skład sygnatury funkcji. Z tego jednak powodu obie funkcje muszą mieć możliwość zrócenia typu zmiennej, dla której służą jako setter i getter.
Warto zwrócić jeszcze uwagę na to, że taka implementacja możliwa jest dlatego, że ChucK przeciąża operator => na potrzebu wywołań funkcji. Z tego powodu jest równoznaczne, w który z dwóch poniżej podanych sposobow funkcja zostanie wywołana.
SndBuf buf1, bu2; Player player; // tradycyjnie player.buffer( buf2 ); // chuckowo buf1 @=> player.buffer;
No i tak. Praując na codzień w ActionScripcie, który nie pozwala na przeciążanie funkcji, przygoda z ChucKiem staje się oddechem świeżego powietrza.