【发布时间】:2016-06-03 20:12:20
【问题描述】:
描述+示例+说明:(可以跳到问题部分)
我想做一个对象实例,它可以通过不同的实现来实现,取决于一个条件(互联网状态)。
简单声明
@interface LoginController : NSObject
/** The currently logged-in User. Nil if not logged-in yet. */
@property (strong, nonatomic) User *currentUser;
// Singleton object
+ (instancetype)shareInstance;
/** Abstract methods, will do nothing if call directly. Use inheritance implements (Online/Offline) instead. */
- (User *)loginByEmail:(NSString *)email password:(NSString *)pwd;
@end
@interface LoginControllerOnline : LoginController
// Login will call request to server.
@end
@interface LoginControllerOffline : LoginController
// Login will check data in coredata.
@end
LoginController 的登录方法实际上什么都不做(return nil)。相反,继承的类(在线/离线)覆盖了父登录的方法,具有不同的实现(如在 cmets 中)
然后,我有一个经理来定义应该使用哪个类:
@implement InternetManager
+ (LoginController *)loginController
{
return [self hasInternet] ? [LoginControllerOnline shareInstance] : [LoginControllerOffline shareInstance];
}
+ (BOOL)hasInternet
{
// Check with Reachability.
}
@end
这项工作。但这不是我想要实现的机制。
- 这意味着我有 2 个继承的 LoginController 实例而不是 1 个。
- 当
internetStatus从offline更改为online时,我想重新在线登录(以获取会话/oauthToken...)。但是,我必须做很多事情(复制用户、更改实例、检查保留...)才能真正从在线登录调用
问题:
有没有办法让我只创建一个 LoginController 实例,它具有相同的属性 (User),但可以有不同的(动态)实现(在线/离线)?
更新问题:
引用苹果Dynamic typing:
ISA 指针:
每个对象都有一个 isa 实例变量 标识对象的类。运行时使用这个指针来 在需要时确定对象的实际类。
那么,有没有办法让我改变这个对象实例的isa pointer?
【问题讨论】:
标签: ios objective-c inheritance design-patterns polymorphism