2013-03-15 12 views
9

Mam app iPhone, w którym klasa jest podklasą UIViewController:Jak mogę dziedziczyć niestandardowe klasy z wielu klas nadrzędnych?

enter image description here

Teraz tworzę nową aplikację, w której chcesz ponownego wykorzystania A, ale mają to podklasy z B, co jest w porządku, bo B podklasy z UIViewController:

enter image description here

Ale teraz mam inna klasa, C, który jest podklasą GLKViewController:

enter image description here

Problem pojawia się, gdy próbuję zrobić trzecią aplikację, która re- używa B bez żadnych zmian. Od B dziedziczy z UIViewController, muszę jakoś powiedzieć C że powinien dziedziczyć BizGLKViewController, co uważam, że jest to przypadek wielokrotnego dziedziczenia:

enter image description here

Z tego co czytam najlepiej radzić sobie z kompozycją, ale nie rozumiem, jak najlepiej zastosować ją do mojej sytuacji n.

Jako rozwiązanie Podstawiony, że sobie sprawę, że po prostu utworzyć opakowanie klasy D który można następnie zmodyfikować na podstawie aplikacji, przez aplikacji podklasy z odpowiedniego nadrzędnej do danego zadania:

enter image description here

enter image description here

ale wydaje rodzaj hacky. Czy jest lepszy sposób to zrobić?

+0

Co to jest kontroler UIScrollViewController? – jrturton

+1

Co powiesz na używanie kategorii na UIViewController zamiast jej podklasowania? Ponieważ UIScrollViewController dziedziczy z UIViewController, twoja kategoria byłaby użyteczna także w przypadkach instancji UIScrollViewController. Ow, i naprawdę dobrze napisane pytanie +1 na to! – Till

+3

Nie możesz tego zrobić w Objective-C jest pojedyncze dziedziczenie - jak java użyj paradygmatu kompozycji lub delegacji –

Odpowiedz

7

Cel C obsługuje tylko pojedyncze dziedziczenie. W takim przypadku prawdopodobnie będziesz chciał użyć protokołów dla wspólnej funkcjonalności. Możesz użyć obiektu pomocniczego do implementacji metod protokołu. W takim przypadku nie interesuje Cię, czy obiekt jest członkiem konkretnej klasy, ale czy implementuje określony zestaw metod.

+1

Jestem ciekawy, do której klasy się odwołujesz, gdy mówisz "nie jesteś zainteresowany tym, czy twój obiekt jest członkiem konkretnej klasy" - UIViewController czy B?Ponieważ jestem prawie pewien, że naprawdę interesuje mnie to, że jest częścią obu klas, zarówno pod względem dostępu do zmiennych i metod instancji. – todd412

+0

Prawidłowo, protokoły umożliwiają podobne funkcje do dziedziczenia wielokrotnego. Niestety, nie zezwalają one na domyślne implementacje, które często prowadzą do powielania kodu pr mniej eleganckich rozwiązań, które polegają na klastrach klas (obiekty pomocnicze, jak je nazywacie). W każdym razie, z perspektywy zewnętrznej, która może być świetnym zamiennikiem. – Till

3

Nie można tego zrobić w Objective-C jest pojedyncze dziedziczenie - jak java lub większość innych współczesnych języków.

wykorzystanie paradygmat składu lub delegacji

+0

naprawiono - usunięto ios z komentarza –

+1

... i usunąłem prawdopodobnie ostry komentarz ...: D – Till

1

można ewentualnie dostać te objęte zastosowaniem kategorię. Z pewnością nie jest to to samo, co wielokrotne dziedziczenie, ale czasami wykonuje to zadanie.

Pozwolę sobie przygotować przykład dla kategorii i sprawdzić, czy ma to na celu.

Header: UIViewController+MyAwesomeExtension.h

@interface UIViewController (MyAwesomeExtension) 
- (void)doSomething; 
@end 

Realizacja: UIViewController+MyAwesomeExtension.m

@implementation UIViewController (MyAwesomeExtension) 
- (void)doSomething 
{ 
    NSLog(@"doing something totally awesome"); 
} 
@end 

Teraz używasz go od wewnątrz jednego z UIViewController podklasy, która obejmuje również jak na przykład GLKViewController ...

Realizacja:

#import "UIViewController+MyAwesomeExtension.h" 
... 
[self.viewControllerDerivedClass doSomething]; 
... 

Należy zauważyć, że taka kategoria ma swoje granice. Aby dowiedzieć się więcej, możesz dowiedzieć się nieco dalej.


Ogólnie rzecz biorąc, myślę, że „większość” prawidłowa odpowiedź będzie za pomocą protokołów się zbliżyć do wielokrotnego dziedziczenia, jak to możliwe, jak Mike C. zredagowany w swojej odpowiedzi. Moja odpowiedź jest głównie obejściem prostych spraw.

+0

Dzięki, nie jestem pewien, czy dana kategoria by sobie poradziła - moja klasa A polega na dziedziczenie zarówno zmiennych instancji, jak i metod instancji zarówno z B, jak iz UIViewController (lub GLKViewController) i A staje się także właścicielem pliku dla pliku .xib. Więc nie jest jasne, czy kategoria może zrobić wszystkie te rzeczy. – todd412

Powiązane problemy