4

我今天做了一件有点恶心的事。

我们所有的视图控制器都继承自两个不同的父视图控制器,比如说 XXXViewController 和 YYYViewController。XXXViewController 又继承自TrackedUIViewController,这是 Google Analytics SDK 中提供的一个类,因此您的所有视图控制器都可以从它继承并轻松跟踪它们。

然而,YYYViewController 继承自不同类型的视图控制器。啊,这是一段我真的不想更改的开源代码。

这里有什么问题?我们无法跟踪任何 YYYViewController 子项,因为我们无法访问 TrackedViewController 中提供的方法,因为它们是私有的。

我不想修改 Google Analytics SDK 中提供的源代码。那我做了什么?创建一个公开这些方法的类别,只是为了避免编译错误。

这样做的明显缺点是它可能会破坏 GA 源代码更改,但它很容易检测到。

我想知道这样做我可能会面临哪些其他问题,以及你们是否能想到更好的方法。

谢谢

4

3 回答 3

3

你可以在 YYYViewController 的继承链中往上走,依次看看它继承自哪个类。如果是 UIViewController,只需在源代码中将该特定超类更改为 TrackedUIViewController 即可。

更好理解的示例:假设YYYViewController继承自ZZZViewController,而后者又继承自UIViewController。现在您可以将ZZZViewControllerfrom的超类更改UIViewControllerTrackedUIViewController- 由于TrackedUIViewController继承 from UIViewController,不会丢失任何功能,但神奇的是您的整个YYYViewController类将变得可跟踪。

希望这可以帮助 :-)

于 2012-09-18T15:10:37.283 回答
0

您已经提到了使用未记录 API 的最大风险:对 API 的更改超出了您的控制范围,并且可能会破坏您的逻辑,例如,如果方法被删除/重命名,或者它们的行为不再符合您的期望。

从纯技术的角度来看,我看不出还有什么问题,因为在 Objective-C 中所有方法都是公共的。只要它们继续存在,您就可以继续调用它们。

于 2012-09-18T14:58:10.753 回答
0

我会说根本问题是过度的子类化。保持视图控制器层次结构浅。使用组合而不是子类化。如果您必须子类化,请确保类提供的功能可以由其子类打开和关闭。

于 2012-09-18T15:14:00.100 回答