【问题标题】:Objective-C class clusters and private class initializersObjective-C 类簇和私有类初始化器
【发布时间】:2011-09-01 06:35:24
【问题描述】:

通常,作为一个优秀的 Cocoa 公民,我编写了返回类型 id 的初始化程序(即指向泛型对象的指针),以便以后进行子类化(尽管 99% 的时间我不需要它)。

现在我正在创建自己的班级集群(许多私有班级都以单个公共班级为上限)。问题:我是否还需要将私有类的初始化器定义为返回泛型id 指针:

- (id)initSubclassForFooClassCluster;

或指向私有类本身的指针,例如:

- (SubclassForFooClassCluster *)initSubclassForFooClassCluster;

【问题讨论】:

标签: objective-c design-patterns abstract-factory class-cluster


【解决方案1】:

您可以只在您的 init 方法中使用 (id),声明一个更具体的类型对您没有多大用处。如果你真的想将你的私有子类设为私有,你应该使用 id,否则你会将你的类的内部信息泄露给外部世界,而这些信息实际上并不需要,这取决于你的需要。

NSString 是一个类簇,它的所有 init 方法都返回 id,因为同一个方法可能返回不同的对象类型,具体取决于您传递给 init 方法的内容。

【讨论】:

  • 不使用id怎么会泄露内部信息? NSLog 语句将显示由公共类的初始化程序返回的私有类的名称。
  • 正确,但这只能在运行时发现。如果您的方法签名中包含(可能是私有的)子类类型,您的 API 的客户端可能会直接引用这些类型,这抵消了拥有旨在隐藏类层次结构的实现细节的不透明超类的好处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多