【问题标题】:How do I hide the public API methods of my extending class?如何隐藏扩展类的公共 API 方法?
【发布时间】:2013-09-06 15:59:54
【问题描述】:

我已经编写了一个 DataAdapter 库,它与核心数据库具有依赖关系(紧密耦合)(核心数据库有助于在数据库中存储、管理数据),因此我在 DataAdapter 类中创建 API,扩展核心数据类以具有快速访问所有核心数据类的API。

但是,由于我在 DataAdapter 类中扩展了核心数据类,因此核心数据类中的所有 API 都可以通过 DataAdapter 类对开发人员可见(我不希望发生这种情况,基本上希望他使用适配器 API仅限方法。)

例如:核心数据有一个 API

  • (CoreDataResponse *) getAllManagedObjectsOfEntity:(CoreDataRequest *)request;

DataAdapter 有一个 API 为 `

-(DBResponse *)getAllStoredRecordsFromDB;

确切的问题是,适配器方法的 Xcode 自动建议显示核心数据 API 以及以下 - 但我希望我的开发人员使用数据适配器仅访问 DataAdapter 的 API 方法,我该如何实现?

更新 -1:这是我使用 coredata 扩展的适配器头类

#import "CoreDataManager.h"

@interface DataAdapter : CoreDataManager
-(DBResponse *)getAllStoredRecordsFromDB;
@end

【问题讨论】:

  • 在 DataAdapter 库的实现文件中编写 CoreData 库的导入语句。在实现文件中创建与 CoreData 相关的所有属性,暗示它们是私有的。
  • 由于我在 DataAdapter 类中扩展了 CoreData 库,这些 CoreData API 方法仍然可以通过我的 DataAdapter 类实例访问。
  • 另外,当我从核心数据扩展适配器时,这个导入语句必须包含在 adapter.h 类文件中。
  • 您可以在您的实现文件中从Core Data 中移动与适配器相关的属性。请参阅我在答案中向您展示的如何在实现文件中创建属性。

标签: ios api design-patterns


【解决方案1】:

在 //DataAdapter.m

#import <CoreData/CoreData.h>

@interface DataAdapter()
@property (strong, nonatomic) CoreDataAdapter *adapter;
@end

@implementation DataAdapter

@end

【讨论】:

  • 同意。这不会将核心数据 API 暴露给第 3 方开发人员,但我不应该扩展 CoreData 类以比采用您的方法更轻松地访问他们的 API 吗?
  • 如果您不希望其他人访问 CoreData 相关的属性,您需要将它们设为私有。这样您就可以将其设为私有,开发人员将无法访问这些属性。而且我不明白这比在头文件中声明属性或在头文件中包含导入语句有多困难?
  • 有没有一种方法可以通过在适配器中扩展 coredata 来实现?
  • 我现在很困惑。扩展核心数据是什么意思?请张贴您在头文件中编写的代码。
  • 尝试在 DataAdapter.h 中使用 @class CoreDataManager。在 DataAdapter.m 中使用 #import "CoreDataManager.h"。然后检查已经导入DataAdapter.h的类是否可以访问CoreDataManager.h。
猜你喜欢
  • 2011-10-08
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2015-03-27
相关资源
最近更新 更多