【问题标题】:Is it possible to extend(heritance) class in Objective-c as is traditionally conceptualised in other languages?是否可以像传统上在其他语言中概念化的那样在 Objective-c 中扩展(继承)类?
【发布时间】:2013-10-05 10:27:26
【问题描述】:

鉴于某些属性和方法在我的所有视图中都是稳定的,因此我在整个应用程序类中有很多重复的代码。

我希望扩展我正在使用的任何类,以便它自动 inherit all properties and methods 我认为这些类应该是通用的。

我查看了关于扩展类的apple guide。但我对我能达到的遗传水平感到困惑。

我已经成功地创建了Categories,比如说UIViewController。但这限制了我只能声明Methods。我不能在我的Category 上声明Properties 并在我的Category 或扩展类中调用它们。我希望能够声明 Properties 并在我的扩展类内部和外部使用它。

这是我第一次尝试在 Objective-C 中扩展一个类,充分利用继承,但我不知道这是否可能。我错过了什么吗?

作为下面代码中的示例,每次我尝试在我的方法 _activityIndicator 中实例化 activityIndicatorView 时,它都无法识别它。我试过@syntetize@dynamic 但它不起作用

注意:我正在根据如何实现方法和属性的继承来寻求答案。没有强调哪些类别不能做(因为我已经尝试过并且知道我不能在那里拥有属性)

我的尝试达到了

#import <UIKit/UIKit.h>

@interface UIViewController (customViewController1)

@property (strong, nonatomic) UIView *activityIndicatorView;
- (void) _activityIndicator;
@end

#import "UIViewController+customViewController1.h"

@implementation UIViewController (customViewController1)


- (void) _activityIndicator {
//......
}

【问题讨论】:

  • 类扩展和继承是两双不同的鞋子。使用扩展,您可以扩展现有类但不创建新的子类。扩展(类别)适用于其他方法,而不适用于属性。如果你需要用 poperties 来扩展它,那就有点棘手了。
  • 你为什么不只是 inehrit?加上所有类的常规继承可以实现(符合)相同的协议。协议类似于 Java 中的接口。使用协议,你也可以只添加方法而不是属性(afaik),但你当然可以添加你需要的 getter 和 setter。

标签: objective-c cocoa-touch cocoa


【解决方案1】:

你的问题太宽泛了,而且不清楚你的问题是什么。是的,您可以在 Objective-C 中进行子类化。

这一切都在 Apple 的文档“Object-Oriented Programming with Objective-C”,“The Object Model”部分,“Inheritance”小节中有详细记录。

【讨论】:

    【解决方案2】:

    类别是添加功能的好方法,同时符合面向对象的原则,优先考虑组合而不是继承。 类别仅添加方法,您不能使用类别将变量添加到类中。如果该类需要更多属性,则必须对其进行子类化。

    【讨论】:

      【解决方案3】:

      使用术语“扩展”时,你是在谈论创建一个子类。这就是 IIRC,该术语在 Java 和其他一些语言中的使用方式。

      Apple 使用不同的术语(正如 Hermann Klecker 在他的第一条评论中暗示的那样)。它们的字面意思是扩展一个具有更多功能(以方法的形式)的现有类——这就是类别的作用。这是正常的英文定义;在现实世界中扩展某些东西通常不会创造出新事物。

      Objective-C 也支持子类;它只是不称它们为“扩展”超类。这叫创建子类,继承自超类。

      【讨论】:

        【解决方案4】:

        严格来说,您不能向现有类添加属性,这与创建子类有任何不同。

        如果您不能停止自己并且不能选择子类化,那么您可以使用 getter 和 setter 来扩展您想要存储在类中的属性的类。 您可以使用objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy) 将对象(它不能是标量,必须是对象)存储在全局空间中,而不是将其真正存储为成员/实例变量/属性,这是您无法做到的。

        这是某种具有两个键的全局字典,键本身和要关联存储对象的对象。在您的情况下,这是扩展类类型的对象。 setter 将它存储在那里,getter 使用objc_getAssociatedObject 从那里接收它。

        您可以通过将nil 作为value 发送到objc_setAssociatedObject 来删除关联

        AFAIK 保留的关联对象(值)在持有关联(对象)的对象被释放后不久被释放。

        有关更多详细信息,请参阅 Ojbective-C 运行时参考https://developer.apple.com/library/ios/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

        只是:我并不是说这严格遵循 OO 范式。 :-)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-16
          • 2017-06-12
          • 1970-01-01
          • 2015-12-05
          • 1970-01-01
          相关资源
          最近更新 更多