【问题标题】:Initialize a subclass from a superclass in Objective C在Objective C中从超类初始化子类
【发布时间】:2016-06-23 15:10:33
【问题描述】:

我创建了一个名为 MyImageUIImage 子类。 MyImage 显然响应了最初由 UIImage 实现的每个方法。我想完全隐藏 UIImage 实现,例如 MyImage 重新声明了一个方法,如:

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets;

- (MyImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets; 

我尝试编写如下实现:

- (MyImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets {
    UIImage *original = [super resizableImageWithCapInsets:capInsets];
    MyImage *result = [[[self class] alloc] initWithUIImage:original];
    return result;
}

- (id) initWithUIImage:(UIImage *)image {
    // HOW TO IMPLEMENT THIS METHOD???
}

但我停在了 initWithUIImage 方法。如何在不使用合成的情况下实现这种行为?

【问题讨论】:

  • 也许你可以考虑让你的班级成为proxy。这样你就可以只公开你想要的方法。

标签: ios objective-c oop subclass


【解决方案1】:

你不想那样做。它有很多不必要的代码,很有可能破坏某些东西。不要重新声明这些方法。您是否有特定的原因要这样做?

【讨论】:

    【解决方案2】:

    这里的问题很简单,叫做:INHARITANCE。

    不要做inaritance,而是提供一些拥有UIImage的类。它会更容易,更可靠。

    另一个问题是您没有解释为什么需要在UIImage 中进行更改!我很确定你正试图以令人讨厌的方式解决一些简单的问题。

    【讨论】:

      【解决方案3】:

      答案是你不能做你想做的事。 MyImage 是一个 UIImage,意味着它隐含地具有 UIImage 的所有方法和属性。您可以添加新的,但永远不要删除现有的。

      并且 UIImage 被用于整个系统 API。你到底想通过这样做来完成什么?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2011-06-19
        • 2016-06-13
        • 2020-02-05
        • 2017-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多