objective-c - 当方法可以返回子类时,返回类型应该是什么?

标签 objective-c cocoa polymorphism

以下是一些 Apple 类中的一些方法:

- (NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID;
- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;

+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context

期望所有这些方法返回返回类型的子类是合理的。因此,返回的对象通常被分配给预期类型的​​变量,例如:

BCCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[BCCustomTableViewCell cellIdentifier]];

这让编译器不高兴;类型转换解决了这个问题,但是这样的类型转换很脏:

BCCustomTableViewCell *cell = (id)[tableView dequeueReusableCellWithIdentifier:[BCCustomTableViewCell cellIdentifier]];

但是,当返回类型为 id 时,可以删除此转换,尽管以某种类型安全为代价,从而使我的代码更清晰:

BCPerson *person = [NSEntityDescription insertNewObjectForEntityForName:BCPersonEntityName inManagedObjectContext:context];

就我个人而言,我更喜欢返回类型为 id 的情况。 Apple 选择一种方法而不是另一种方法是否有任何理由,或者仅仅是因为编写这些方法的开发人员的偏好?

最佳答案

在您描述的三个示例中,两个不同的原则在起作用:

在前两个方面,Apple 希望您使用强制转换作为“我知道我在做什么”之类的事情:当您通过标识符访问通用对象时,您可能最终会对类感到惊讶返回值,除非您知道自己在做什么。

在后面的例子中,方法本质上是一个工厂方法,相当于alloc init,在大多数情况下你最好知道你在做什么。

换句话说,回答你的问题:

对于工厂方法,id,对于getter,与setter相同。

关于objective-c - 当方法可以返回子类时,返回类型应该是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4613582/

相关文章:

iphone - 带有 NSURLErrorDomain 错误 -999 的 weblock 错误

iphone - 切换到前置摄像头后相机卡住

objective-c - 设置 OSX 状态栏应用程序图像颜色

c++ - boost 序列化多态性问题

ios - 如何在IOS中维护堆栈?

ios - YTPlayer将重定向到OAuth2 URL并显示“请稍候”

objective-c - 如何在 NSCollectionView 的行和列之间留出空间?

swift - 用于在管道结果时链接异步操作的 GCD 模式

c++ - 抽象类和多态性

Java 重写私有(private)函数不显示多态行为