Mam trzy klasy, które implementują ten sam protokół i mają tę samą klasę nadrzędną, która nie implementuje protokołu. Normalnie powinienem mieć protokół jako czyste wirtualne funkcje w klasie nadrzędnej, ale nie mogłem znaleźć sposobu, aby to zrobić.Objective-C Wskaźnik do klasy implementującej protokół
Chcę wykorzystać polimorfizm na tych podklasach, deklarując czyste funkcje wirtualne w superklasie, a następnie dzieci będą implementować te funkcje. Jednak jedynym sposobem, jaki udało mi się osiągnąć w tym celu, jest to, aby każde dziecko jednoznacznie zdecydowało się na wdrożenie protokołu. Kiedy robię to w ten sposób, superklasa nie wie, że dzieci będą implementować ten protokół, więc istnieją ostrzeżenia o czasie kompilacji wszędzie wokoło.
Niektóre pseudo-kod, jeśli że nie ma sensu:
@interface superclass: NSObject
{}
@interface child1: superclass<MyProtocol>
{}
@interface child2: superclass<MyProtocol>
{}
Konsument z tych klas:
@class child1
@class child2
@class superclass
@interface SomeViewController: UIViewController
{
child1 *oneView;
child2 *otherView;
superclass *currentView;
}
-(void) someMethod
{
[currentView protocolFunction];
}
Jedyny dobry sposób znalazłem zrobić czystych funkcji wirtualnych Objective-C jest hackiem przez umieszczenie [self doesNotRecognizeSelector:_cmd];
w klasie nadrzędnej, ale nie jest idealny, ponieważ spowoduje błędy w czasie wykonywania, a nie czas kompilacji.
Wydaje się, że sposób objc czystych-virtual/metod abstrakcyjnych jest „klasy klastrów”. Może być coś wartego dla ciebie dochodzenia. – nmr