子類聲明`delegate`屬性與父類同名但類型不同時,編譯器報錯`Property type 'xxx' is incompatible with type 'xxx' inherited from 'Parent'`。本文解析衝突本質與三種解決策略。
Objective-C/Swift中,屬性名佔用同一命名空間。子類重新聲明同名屬性實際上是嘗試覆寫,但類型不兼容(如父類`id
若子類邏輯兼容父類協議,**無需重新聲明**,直接用繼承來的`delegate`:
// 父類
@property (weak, nonatomic) id delegate;
// 子類:完全不聲明delegate,直接用父類的
// 調用時:[self.delegate parentMethod];
// 若需子類專有方法,擴展父類協議或轉型調用
若子類確需專有協議,**令子類協議繼承父類協議**,然後覆寫屬性:
// 協議定義
@protocol ParentDelegate
- (void)parentMethod;
@end
@protocol ChildDelegate // 繼承父協議
- (void)childMethod;
@end
// 父類
@property (weak, nonatomic) id delegate;
// 子類 覆寫(類型更具體,符合协变原则)
@property (weak, nonatomic) id delegate; // 編譯器允許:ChildDelegate符合ParentDelegate
若兩協議無繼承關係或邏輯完全獨立,**改名避開衝突**最清晰:
// 父類
@property (weak, nonatomic) id parentDelegate;
// 子類
@property (weak, nonatomic) id childDelegate; // 無衝突
核心原則:繼承體系中delegate屬性應保持單一、類型協變、職責清晰。