ios - 在所有构造函数中不调用 super 的类实例化

标签 ios inheritance constructor initialization

我有以下情况: 我正在扩展 UITextView 控件 (MyTextView : UITextView)。根据运行时设备版本,我有不同的实现。所以目前我在 MyTextView 类的实现中有很多“if-else”语句。

为了使其更易于维护,我想将其拆分为不同的类:

MyTextViewIos5:MyTextViewMyTextViewIos6:MyTextView

创建一个工厂函数,该函数将在运行时知道根据设备 iOS 版本创建哪个子类

如果我使用 MyTextView 作为参数,此解决方案将完美运行。

MyTextView* textView = [Factory createWithFrame:frame];

当有一个继承自 MyTextView (externalTextView:MyTextView) 的类并使用特定方法扩展它时,问题就开始了, 它的 initWithFrame 方法将如下所示:

- (id)initWithFrame:(CGRect)frame {
    self = [Factory createWithFrame:frame];
    if (self) {
        ...
    }
    return self;
}

我没有调用 super initwithFrame,而是调用我的工厂。

当我调用 externalTextView 特定方法时,应用程序崩溃并出现错误,即 MyTextViewIos5MyTextViewIos6 未实现调用的特定方法.

是否有解决方法让它工作?

最佳答案

简单地分配 self = [Factory createWithFrame:] 仅为 MyTextViewIos5MyTextViewIos6 初始化数据,而不是您的自定义类。结果,自定义类的方法表等不存在,这就是它崩溃的原因。

继承的本质是,您必须子类化 MyTextViewIos5 MyTextViewIos6 才能继承它们的功能。问题是您不知道是哪个。

我建议将自定义类的功能分离到委托(delegate)/协议(protocol)设计中。 MyTextView 父类(super class)可以包含用于管理委托(delegate)的代码。

类似于:

- (void)methodCustomSubclassWouldHaveOverridden
{ 
   [delegate handleThisForMe];
}

关于ios - 在所有构造函数中不调用 super 的类实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17601069/

相关文章:

Java - 在构造函数中为多个变量分配参数

ios - 构建后 XCode iOS 颜色不匹配

ios - 核心数据和数组 swift 2.0

ios - 将多个 Twitter 时间线动态地组合成单一显示

javascript - 在 JavaScript 中调用继承的父方法时返回正确的子类型

multithreading - 构造函数中的过早泄漏

ios - 如何覆盖 Swift 委托(delegate)方法以获取更多参数?

python - 从元组子类继承

delphi - 我可以在抽象基类中保存任何数据成员吗?

c++ - 您可以将 "this"静态转换为基类构造函数中的派生类,然后稍后使用结果吗?