And*_*rew 4 cocoa-touch objective-c ios
我有一个名为的类SPPanelManager,它具有另一个类的属性,名为SPPanelSettingsManager.SPPanelManager的-init方法如下:
self.settingsManager = [[SPPanelSettingsManager alloc] init];
Run Code Online (Sandbox Code Playgroud)
目的SPPanelManager是进行子类化,并在我的应用程序中使用子类.例如,有SPGreetingManager.在.h文件中SPGreetingManager,我已声明:
@property (nonatomic, strong) SPGreetingSettingsManager *settingsManager;
Run Code Online (Sandbox Code Playgroud)
这使得settingsManager属于正确的类.问题是当SPGreetingManager初始化子类时,它调用上面的init方法,并将settingsManager初始化为SPPanelSettingsManager类,而不是SPGreetingSettingsManager.
我怎样才能将它初始化为该属性的正确类而不必在每个子类中重写init代码?
超类(SPPanelManager)以某种方式必须知道具体面板管理器想要用作哪个类settingsManager.
Apple使用以下方法将CALayers与UIViews匹配:
基类声明一个返回具体SPPanelSettingsManager子类的类方法:
// in SPPanelManager.h
+ (Class)settingsManagerClass;
Run Code Online (Sandbox Code Playgroud)
...哪些子类重写以返回其自定义类:
// in SPGreetingManager.m
+ (Class)settingsManagerClass
{
return [SPGreetingSettingsManager class];
}
Run Code Online (Sandbox Code Playgroud)
现在,超类可以实例化设置管理器,如下所示:
self.settingsManager = [[[[self class] settingsManagerClass] alloc] init];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |