2013-02-28 2 views
2

Я занимаюсь созданием подкласса UITableViewController (назовите его «MyTableViewClass», который в конечном итоге будет подклассифицирован для определенных контроллеров табличных представлений (назовите его «MySpecificTableViewClass». некоторые методы, которые находятся в MySpecificTableViewClass, должны быть «требуемыми», т. е. интерфейс разработчика говорит, что «реализация не завершена». Есть ли способ сделать это без объявления в протоколе в MyTableViewClass?Общие сведения о протоколах и подклассах

MyTableViewClass.h

#import <UIKit/UIKit.h> 

@class MyTableViewClass; 
@protocol MyTableViewClassProtocol <NSObject>; 

-(void) fooBar; 
@end 

@interface MyTableViewClass : UITableViewController <NSFetchedResultsControllerDelegate, MyTableViewClassProtocol> 
.... 

Это будет указывать в моей реализации MyTableViewClass, что я «забыл» реализовать fooBar. Я думаю, что я могу справиться с этим методом заглушки (это лучший способ?).

MySpecificTableViewClass.h

.... 
#import "MyTableViewClass.h" 

@interface MySpecificTableViewClass : MyTableViewClass 
.... 

В реализации MySpecificTableViewClass - предупреждение не показывает, что я пропускаю

-(void) fooBar 

Если изменить MySpecificTableViewClass.h к

.... 
#import "MyTableViewClass.h" 

@interface MySpecificTableViewClass : MyTableViewClass <MyTableViewClassProtocol> 
.... 

Тогда я сделайте предупреждение, но запомнить, чтобы определить протокол, кажется интуитивным, или я полностью что-то упустил?

ответ

2

Я не нашел отличного способа реализовать это, кроме как положить в заглушки и вызвать NSAssert() в них, чтобы поймать (во время выполнения) любые нереализованные методы. Objective-C не имеет понятия абстрактного класса.

Тем не менее, и хотя я сам использовал этот образец, часто лучше переосмыслить свой дизайн и использовать шаблон стратегии и протоколы. То есть вместо абстрактного MyTableViewClass создайте MyTableViewHandler, который является подклассом NSObject и содержит любую специальную логику, в которой вы нуждаетесь. Тогда ваши контроллеры табличных представлений могут быть прямыми подклассами UITableViewController и делегатами от MyTableViewHandler. Как делегат, протокол может быть применен. И это создает более простую и гибкую объектную модель. Это не всегда уместно, и абстрактные классы имеют свое место, но рассмотрите шаблон стратегии, прежде чем перейти к чистому наследованию. Он часто работает лучше.

+0

Теперь я понимаю. На данный момент я только что сделал то, что вы описали в параграфе 1 (за исключением того, что я использовал NSException), чтобы плохой, нет способа заставить среду разработчика видеть это перед временем выполнения. Ваше решение параграфа 2, безусловно, кажется более изящным, но на данный момент, поскольку у меня есть большая часть кода, уже сделанного подклассифицированием UITableViewController, это будет сделано. –

0

Поскольку MyTableViewClass уже реализует протокол, его подклассы будут получать эти реализации для них. Это означает, что подклассы также реализуют их. Вы можете изменить/расширить реализации в своих подклассах.