Object vs. class (rozdzial 13 The NEURON book)
Klasa (class) – definicja dla obiektow, zawierająca zbior funkcji i procedur
Obiekt klasy (object) – konkretny element danej klasy (instancja)
Tworzenie klasy:
begintemplate classname
public name1, name2, name3, . . .
external variable1, string2, function3, template4, . . . . . . hoc code . . .
endtemplate classname
public – definiuje zmienne, procedury, funkcje widoczne z zewnatrz
external – umożliwia uzyskanie przez obiekt informacji z zewnatrz (deklaracja jest potrzebna nawet jesli zmienna jest global )
Inicjalizacja w obiekcie
Domyslne, poczatkowe wartości wszystkich zmiennych w
obiekcie klasy wynosza 0. Aby zainicjalizowac zmienne do innych wartosci, klasa musi zawierac procedure init().
Utwórzmy nastepujacy nowy plik test.hoc z templatem bez inicjalizacji:
begintemplate Foo public a
a = 5 // this is a direct command endtemplate Foo
Nastepnie wczytajmy go do Neurona i wykonajmy nastepujace polecenia:
oc>objref f
oc>f= new Foo() oc>f.a
0
W wyniku dostajemy wartosc f.a 0, a nie 5.
Inicjalizacja w obiekcie
Dodajmy do utworzonego template’a inicjalizację:
begintemplate Foo public init, a proc init() { a=5
}
endtemplate Foo
Wczytajmy do Neurona i wykonajmy:
oc>objref f
oc>f= new Foo() Oc>f.a
5
oc>f.a = 6 //przypisanie nowej wartosci oc>f.a
6
oc>f.init() //przywrocenie wartosci poczatkowej oc>f.a
5
Uwaga: NEURON jest ‘czuły’ na położenie nawiasów { }
begintemplate Foo public init, a proc init() {
a=5 }
endtemplate Foo
Proba wczytania powyzszego kodu zakonczy sie:
syntax error in test.hoc near line 3 proc init()
^ oc>
W interpreterze (OC), obiekt jest zbiorem funkcji, procedur i danych; Dane wyznaczają stan obiektu. Funkcje i procedury wyznaczają jego zachowanie. Obiektowość znacznie
zwiększa zdolność do utrzymywania koncepcyjnej kontroli nad całym kodem. Umożliwia tworzenie struktur danych, podobnie jak w C, Pascalu i Pythonie.
Obiektowość pojawiła się w NEURONie dosyć późno – po wprowadzeniu pojęcia sekcji w neuronach i dlatego
występuje w nim dużo zmiennych (np. sekcje, mechanizmy i zmienne typu range), które koncepcyjnie są traktowane jak obiekty, ale nie maja jednorodnej składni.
Programowanie obiektowe w HOC
Deklaracja obiektu:
objref name1, name2, name3, ...
Tworzenie obiektu:
objref g[3]
for i=0,2 { g[i] = new Graph() }
Używanie obiektu – dostęp do widocznych elementów obiektu
uzyskuje się poprzez ‘.’, podobnie jak do pól i metod obiektu w C++):
g[1].erase() //usuwa narysowane linie z wykresu
g[2].size(0,1,0,10) // definicja układu współrzędnych wykresu
//wartości odnoszą sie do xmin, xmax, ymin, ymax g[2].xaxis() //rysuje osie x i y
Programowanie obiektowe w HOC