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 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 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 ^ oc>
Programowanie obiektowe w HOC 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