如何使用子类而不是预期类?

Posted

技术标签:

【中文标题】如何使用子类而不是预期类?【英文标题】:How do I use a subclass instead of intended class? 【发布时间】:2012-07-09 16:48:35 【问题描述】:

我有一个包含 UIButton 作为子视图的类。我有一个我制作的 UIButton 子类,它有我自己的修改,我想用它来代替 UIButton,但我不想只是删除原始 UIButton 并添加这个代替,因为这样它就不会响应该类给它的 UIButton 命令。

如何在这里使用我的 UIButton 子类?

希望这是有道理的。

编辑:所以我有一个 UIView 的子类。它被称为 MyView。 MyView 有一个 UIButton 的子视图。我还有一个 UIButton 的子类,称为 MyButton。我想在 MyView 上使用 MyButton 而不是 UIButton。我该怎么做?

【问题讨论】:

你是说你创建了一个新类,比如: MyButton : UIButton ???如果是这样,你想使用 MyButton 而不是 UIButton ???如果是这种情况,那么您只需分配并初始化您的 MyButton 而不是 UIButton ??? @Andrew 如果它在 IB 中,您可以将任何东西的类设置为子类,因此找到可以将按钮类设置为 MyButton 的面板 @Andrew 然后就像 ElGuapo 说的那样说 [[MyButton alloc] init];而不是 [[UIButton alloc] init] «因为这样它就不会响应类给它的 UIButton 命令。»是的,它会。您不覆盖的任何内容都将使用超类 (UIButton) 的实现。 @Andrew,我相信您的问题不仅仅是扩展 UIButton 的功能,您似乎并不真正了解 OOP 方面的继承和多态性的概念。我还建议您阅读一下。 【参考方案1】:

在头文件或实现文件的顶部:

#import "MyView.h"
#import "MyButton.h"

你需要它的地方:

MyView *myView = [[MyView alloc] init];
MyButton *myButton = [[MyButton alloc] init];
[myView addSubview:myButton];

就这么简单,当然将按钮设置在正确的位置,具有正确的大小等,我留给你。

【讨论】:

啊,但是我希望按钮上的属性可以改变,如果它实际上是在 UIButton 的位置,即标题。 如果您在自定义按钮类中有类似的属性,您需要在头文件中而不是在实现中声明它们,以便能够将它们公开给您访问它们的其他类。如果您正在扩展 UIButton,您的自定义按钮将具有与 UIButton 相同的所有相同属性。 您也应该看看@Joe 的回答,如果您所做的只是添加属性,这是一个更好的方法。【参考方案2】:

如果您将UIButton 子类化只是为了添加属性或方法,那么您应该改为create a category。如果您正在创建一个需要覆盖现有方法或执行其他绘图的自定义按钮,那么您只需创建一个按钮实例并将其添加到您的视图中。

MyButton *button = [[MyButton alloc] initWithFrame:CGRectMake(10, 10, 100, 100)];

【讨论】:

我正要发布同样的内容,但由于 @Joe 也是在这方面教育我的人,所以他应该得到赞扬。这是关于该主题的先前帖子:***.com/questions/10193908/… 我知道,但问题是它已经有 UIButton,它是初始化的,我想将它的所有属性添加到我拥有的这个 MyButton 中。 如果按钮已经初​​始化,请使用category。如果您需要 instance 变量来支持属性,请使用我在答案中包含的链接。

以上是关于如何使用子类而不是预期类?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 子类基础,如何添加自定义属性;

从基类访问子类成员的首选方式

在 C++ 中,如何测试对象是不是是父类构造函数中子类的实例?

如何在界面构建器中使用框架中的 UIView 子类

Java:父类对象为啥能转换成子类对象

如何判断Delphi的THeapException是否与堆相关,而不是Windows GDI或其他什么?