让我们考虑一个具有高度自定义或复杂视图的应用程序。
我们将有一种特定类型的视图控制器向特定类型的 UIView 发送方法,其中 UIView 本身由许多其他视图组成。
视图应该有一个丰富的、特定于域的接口,允许控制器行动是它和一个类似丰富的模型之间的薄“胶水”层。
所以我们重写控制器的视图属性如下:
@interface PlaybackViewController : UIViewController<StageLayoutDelegate, ControlPanelDelegate>
{
NSMutableArray* _sections;
LightingMode _lightingMode;
}
@property (nonatomic, strong) PlaybackView* view; // <------ Specific type of view
#pragma mark - injected
@property (nonatomic, strong) id<OscClient> oscClient;
@property (nonatomic, strong) AbstractStageLayoutView* stageLayoutView;
@end
覆盖比定义另一个访问器更有意义,我可以将消息发送到特定类型的 UIView 而无需强制转换。
问题:唯一的问题是它会导致编译器警告:
属性类型“PlaybackView *”与从“UIViewController”继承的“UIView *”类型不兼容
. . 我喜欢构建没有任何警告的代码。这样,一个有效的警告就不会被埋在其他警告中而错过。
问题:
- 有没有办法抑制这个特定的警告?
- 为什么这部分是默认设置,而大多数现代 OO 语言将很高兴地允许覆盖子类中的属性或方法,以便它返回在超类中声明的类型的更具体的子类?