2009-11-10 10 views
10

próbuję wdrożyć projekt następująco:iPhone Objective-C foreach projekt

Touch Klasa: działa jako interfejs, kilka klas dziedziczą z niego:
MoveTouch klasa
JumpTouch klasa
InterfaceTouch klasa

Następnie chcę mieć listę obiektów Touch. Następnie chcę mieć możliwość usunięcia wszystkich obiektów MoveTouch TYLKO (nie innych), a następnie wszystkich obiektów JumpTouch osobno itp. Z tej dużej listy. Niestety, for (MoveTouch* t in touches) nie robi tego, co chcę; wszystko na całej liście zostaje wykorzystane.

Odpowiedz

36

Trzeba przetestować dla typu klasy:

for (Touch *t in touches) { 
    if ([t isKindOfClass:[MoveTouch class]]) { 
    MoveTouch *mt = (MoveTouch *)t; 
    // do what you want with mt 
    } 
} 
0

nie jestem obiektywna programista C.

W twoim przypadku, myślę, że musisz przejść przez listę z tym "dla (dotknij * w dotyku)", a na ciele wymyślić, czy ten obiekt jest albo MoveTouch, czy JumpTouch i tak dalej.

Ale ideą polimorfizmu jest to, że tego nie robisz. Nie sortujesz w swojej pętli. Czynność, którą chcesz wykonać, powinna zostać zdefiniowana w interfejsie, a każda klasa potomna implementuje inną implementację dla tego działania. Na tym polega cały polimorfizm.

+0

... co oznacza, że ​​można zrobić coś takiego jak wywołanie [t update], a następnie każda pozycja będzie decydować, co zrobić w cyklu aktualizacji. Ale to nie jest uniwersalne. Wiele razy masz wiadomość, którą chcesz wysłać do jednej klasy, a nie do drugiej. –

+0

nie uniwersalny, ale ma tendencję do wąchania, moim zdaniem. Zwłaszcza jeśli zaznaczysz, że sam projektujesz klasy. –

+0

Tak naprawdę nie robię z tym polimorfizmu. Moją podstawową chęcią było oddzielenie różnych rodzajów dotyku. Rodzaj dotyku (ruch, skok, interfejs itp.) Może zostać ustalony natychmiast po jego utworzeniu, co dzieje się w ramach "dotykuBegan". Odtąd znacznie łatwiej jest oddzielić funkcjonalność tego, co dzieje się, gdy PRZESUŃ to dotknięcie lub ZAKOŃCZENIE, które dotyka itp. Myślę, że może dziedziczenie jest trochę na to ochotę? Może po prostu proste wyliczenie zadziała? –