我正在开发一个将自定义注释放在 MKMapView 上的模块。我的大部分逻辑目前都在一个继承自 MKAnnotationView 的类中。我已经手动将所有相同的代码复制并粘贴到另一个继承自 MKPinAnnotationView 的类中,因此客户端地图代表可以使用任一自定义子类,具体取决于他们是否需要默认的图钉图像/动画。
为了使这段代码更容易维护/调试,我很想干掉这段代码,让我的两个自定义类都继承自同一个类。但是,我还没有找到一个合适的干净的方法来实现这个继承图:
CustomAnnotationView CustomPinAnnotationView
\ /
\ /
V V
CustomBaseAnnotationImplementation
/ \
/ \
V V
MKAnnotationView MKPinAnnotationView
我试着做这样的事情:
#if UsesPinAnnotationView
#define CustomStandInSuperClass MKPinAnnotationView
#else
#define CustomStandInSuperClass MKAnnotationView
#endif
@interface CustomBaseAnnotationViewImplementation : CustomStandInSuperClass
然后把#define UsesPinAnnotationView 0
我的CustomAnnotationView
和#define UsesPinAnnotationView 1
我的CustomPinAnnotationView放进去,没有一个像我想象的那样工作(我认为它只是使用了预处理器到达的第一个#define并丢弃了另一个#define——最后它使它成为MKAnnotationView的子类在所有情况下,我的代码都成功编译,但随后在无法识别的选择器上崩溃(setAnimatesDrop :)
我一直在研究使用 ObjC Runtime API 在运行时从公共实现文件向我的具体子类添加方法,但这似乎不是一个可行(或必要)的解决方案。
所以,这不是多重继承……它是变量继承。似乎在不规避框架约束的情况下应该可以做到的事情。有任何想法吗?