Temat 2. Klasy Obiekty Dziedziczenie i zaawansowane cechy

advertisement
Temat 2.
Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C
Wymagana wiedza wstępna:
1) Student musi
1) Umieć stworzyć projekt aplikacji konsolowej w XCode z wykorzystaniem
Objective-C
2) Umieć skompilować i uruchomić program w XCode
3) Skorzystać z podstawowych klas i funkcji Objective-C
4) Nauczyć się zasad wywoływania metod w Objective-C
5) Znać język C
6) Znać zasady zarządzania pamięcią w komputerze
7) Znać pojecie wskaźnika
8) Znać podstawowe narzędzia tworzenia aplikacji konsolowych w C
2) Student powinien
1) Znać jezyk Java lub C# lub C++
Cel dydaktyczny
1) Student musi
1) Umieć tworzyć klasy Objective-C
2) Umieć tworzyć hierarchę klas w Objective-C
3) Umieć wykorzystywać późne wywołanie metod w Objective-C
4) Umieć korzystać z kolekcji
5) Umieć tworzyć własne inicjalizatory
6) Znać typ id
2) Student powinien
1) Umieć korzytstać z kategorii klas
2) Umieć definiować kategorie klas
7) Umieć używać wbudowanych struktur danych Objective-C
3) Student może
3) Umieć definiować protokoły
4) Umieć definiować bloki kodu
Zakres tematyczny wykładu i laboratorium
Niniejsze zajęcia wprowadzają szereg zaawansowanych zagadnień związanych z
programowaniem w czystym Objective-C, naświetlając możliwości tego języka pod kontem
różnic do innych znanych języków programowania obiektowego. Zostaną przedstawione
zaawansowane metody deklaracji klas oraz rozszerzania klas istniejących.









Konwencje nazewnictwa klas, obiektów, zmiennych i metod
Składowe publiczne, prywatne i chronione
alloc + init
Właściwości zadeklarowane
Zachowanie właściwości (readonly, readwrite, atomic, nonatomic, strong, retain)
Praca z własną instancją zmiennej
Przechowywanie obiektów w pamięci
Silne referencje i słabe referencje
NSCopying i (copy)
Programowanie Urządzeń Mobilnych Apple - materiały do laboratorium - 1/5









Protokoły i ich deklaracja i implementacja klas z nimi zgodnych
Dziedziczenie protokołów
Definicja i użycie kategorii - rozszerzanie własności klas
Implementacja kategorii w plikach zewnętrznych
Kategorie a nazewnictwo metod
Kategorie anonimowe
Użycie rozszerzania klas do ukrywania prywatnych elementów klasy.
Bloki kodu
Bloki kodu i dostęp do zmiennych
Załączniki
1. Prezentacja_2.pdf - slajdy prezentacji wykładu
Zadania na laboratorium
Zadanie 1
Rozszerz klasę MaszynaLotto z poprzednich ćwiczeń, dodając do niej kategorię,
pozwalającą na wylosowanie dodatkowo jeszcze jednej liczby z zakresu liczb (jak w grze
Lotto z plusem). Użyj do tego kategorii ObjectiveC
1) Kategorię możesz zaimplementować wewnątrz istniejącego pliku lub stworzyć nową
parę plików (MaszynaLotto+Plus.h i MaszynaLotto+Plus.m)
2) Wewnątrz nowopowstałych klas zdefiniuj metodę (NSNumber*)plus;
#import "MaszynaLosujaca+Plus.h"
@implementation MaszynaLotto (Plus)
-(NSNumber *)plus{
int n = arc4random()%self.numery.count;
return [self.numery objectAtIndex:n];
}
@end
Programowanie Urządzeń Mobilnych Apple - materiały do laboratorium - 2/5
3) Zaimportuj do pliku main.m plik nagłówkowy kategorii. Teraz możesz korzystać z klasy MaszynaLotto
i wywoływać na niej metodę plus
#import <Foundation/Foundation.h>
#import "MaszynaLosujaca.h"
#import "MaszynaLosujaca+Plus.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
MaszynaLosujaca * m = [[MaszynaLosujaca alloc]init];
NSNumber * plus = [m losuj];
printf("PLUS: %d\n",(int)plus.integerValue);
for(int i =0;i<6;i++){
NSNumber * l = [m losuj];
printf("%d\n",(int)l.integerValue);
}
}
return 0;
}
Zadanie 2
Stwórz nową klasę MaszynaMulti, która będzie rozszerzała klasę MaszynaLotto z
poprzednich ćwiczeń. MaszynaMulti ma mieć możliwość losowania z 80 liczb.
Podpowiedzi
1) W inicjalizatorze klasy MaszynaMulti uzupełnij brakujące liczby
#import "MaszynaMulti.h"
@implementation MaszynaMulti
-(id)init{
self= [super init];
if(self){
for(int i = 50;i<=80;i++){
[self.numery addObject:[NSNumber numberWithInt:i]];
}
}
return self;
}
@end
2) W pliku nagłowkowym pamiętaj o zaimportowaniu pliku MaszynaLosująca.h
Programowanie Urządzeń Mobilnych Apple - materiały do laboratorium - 3/5
#import "MaszynaLosujaca.h"
@interface MaszynaMulti : MaszynaLosujaca
3) Skorzystaj z tej klasy tak jak w poprzednich przypadkach
MaszynaMulti * m = [[MaszynaMulti alloc]init];
for(int i =0;i<20;i++){
NSNumber * l = [m losuj];
printf("%d\n",(int)l.integerValue);
}
Zadanie 3 (samodzielne)
W podobny sposób skonstruuj klasę MaszynaMiniLotto.
Zadanie 4
Zadeklaruj tablicę, i umieść w niej obiekty MaszynaLotto, MaszynaMulti i MaszynaMiniLotto.
Wylosuj jedną z nich i sprawdź, którą. Na tej podstawie ustal jaką ilość liczb wylosować.
Podpowiedzi
1) Sprawdzenie jakiej klasy jest obiekt może być dokonane za pomocą metody isKindOfClass
if ([maszyna isKindOfClass:[MaszynaMulti class]]){
n=20;
}
Zadanie 5
Dodaj do klasy MaszynaLotto metodę -(void)LosujWszystkie;
W metodzie tej wylosuj i wypisz n liczb. n ma być określone jako właściwość klasy (ustawiana w
inicjalizatorze).
W metodzie main z zadania 4 rzutuj wszystkie obiekty na typ MaszynaLotto* i spróbuj na takim
obiekcie uruchomić tę metodę. Do poszczególnych klas dodaj nowe implementacje metody
losujWszystkie, tak aby wypisywały informację o typie losowania a następnie wywoływały
przeładowaną metodę.
Podpowiedzi
1) Modyfikacja meody main powinna wyglądać tak
MaszynaLosujaca * maszyna =
(MaszynaLosujaca*)[maszyny objectAtIndex:(arc4random()%maszyny.count)];
[maszyna losujWszystkie];
2) metoda losujWszystkie ma korzystać w właściwości ilosc
@property(atomic) int ilosc;
3) Przeładowanie metody losujWszystkie w klasie MaszynaMultiMulti
-(void)losujWszystkie{
printf("%s\n","MultiMulti");
[super losujWszystkie];
}
Programowanie Urządzeń Mobilnych Apple - materiały do laboratorium - 4/5
Zadania samodzielne
Zadanie 6
Utworzyć klasę ONP obliczającą wartość wyrażenia podanego w odwrotnej notacji polskiej. W tym
celu należy wykorzystać strukturę stosu. W metodzie main() pobierz ze standardowego wejścia
ciąg znaków. Następnie zainicjuj instancję klasy ONP z wykorzystaniem jedynego konstruktora
przyjmującego jako parametr obiekt NSString* zawierający wyrażenie. Ponadto klasa powinna
posiadać metodę wyznaczWartosc, która zwróci wartość wyrażenia. Należy założyć, że w
wyrażeniu będą tylko liczby całkowite, jeden operator jednoargumentowy - zmieniający znak liczby
oraz dwa operatory dwuargumentowe + i * reprezentujące dodawanie i mnożenie.
Programowanie Urządzeń Mobilnych Apple - materiały do laboratorium - 5/5
Download