核心数据继承:这样做可以吗?

Posted

技术标签:

【中文标题】核心数据继承:这样做可以吗?【英文标题】:Core Data inheritance: Is it OK to do this? 【发布时间】:2010-12-22 10:56:18 【问题描述】:

示例:我有一个名为Car 的实体,它是抽象。然后有两个子实体CabrioletPickup

现在我有一个名为Driver 的实体,它与实体Car 有一个名为currentCar 1..1 的关系。因此,我可以将 Cabriolet 或 Pickup 分配给任何驾驶员的 currentCar 属性。然后,当我从驾驶员那里获得 currentCar 时,我需要自省对象以在运行时找出我是否有 Cabriolet 或 Pickup。这是 Core Data 中的有效设计吗?

【问题讨论】:

【参考方案1】:

我不明白为什么这在技术层面上不起作用,但它确实违反了 OOP 多态性。

为什么你需要知道汽车的类型?您能否在抽象超类(Car)上定义方法并在子类(CabrioletPickup)中适当地覆盖它们?您能否重构汽车层次结构,使子类的属性变得更通用,并将它们移动到Car 的属性中,从而消除对子类的需求?

在获取从公共超类派生的对象时,我遇到了NSFetchResultsController 的问题。 (返回的对象只能按实体的属性进行排序/分组。类类型不是属性,因此不能用于对实体进行排序/分组。我的解决方案/hack 是超类的type 属性-丑陋,但它有效。)

【讨论】:

敞篷车添加了一个 BOOL hasElectricRoof。基本上问题是如果我获取 currentCar,并且我之前分配了一辆 Cabriolet(这也是一辆汽车),那么我可以将它转换成 Cabriolet 吗?还是 Core Data 不会只获取 Cabriolet 中定义的属性? @BugAlert:是的。您始终可以使用valueForKey: 方法获取数据,前提是该类是NSManagedObject 的子类。 这不是重点,本尼迪克特。我知道我可以获取对象。关键是:当故障被触发时,特殊属性是否可用和获取,还是不会?! 专家选择器是调用valueForKey:的简单方法。一个NSManagedObject 子类完全有可能代表许多不同的实体;没有检查子类中声明的访问器是否会匹配它所代表的实体的机制。

以上是关于核心数据继承:这样做可以吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java的类与接口有什么作用?支持多继承吗?

核心数据继承与无继承

在C#中,一个类可以继承另一个类和一个接口吗?

:before 和 :after 伪元素可以从父元素继承高度吗?

继承,还是我应该使用组合?

C++ 继承:我必须在派生类中重复父属性吗?