Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android上共享领域字段_Android_Oop_Polymorphism_Realm - Fatal编程技术网

在Android上共享领域字段

在Android上共享领域字段,android,oop,polymorphism,realm,Android,Oop,Polymorphism,Realm,Android上的领域 那么有没有办法在Android上共享字段呢?我们有5个模型,它们共享相同的同步相关字段和代码。我们在当前的SQLite模型中使用继承;如果我们切换到Realm,那么在5个模型类中复制同步字段是否是我们唯一的选择 作为一种解决方法,我正在考虑让这些类实现一个带有共享字段的getter和setter的Syncable接口,这至少让我可以共享同步功能。有更好的办法吗 要共享同步功能,我的最佳猜测是创建一个静态的同步器类,并将其传递给Syncable模型对象Synchronize

Android上的领域

那么有没有办法在Android上共享字段呢?我们有5个模型,它们共享相同的同步相关字段和代码。我们在当前的SQLite模型中使用继承;如果我们切换到Realm,那么在5个模型类中复制同步字段是否是我们唯一的选择

作为一种解决方法,我正在考虑让这些类实现一个带有共享字段的getter和setter的
Syncable
接口,这至少让我可以共享同步功能。有更好的办法吗

要共享同步功能,我的最佳猜测是创建一个静态的
同步器
类,并将其传递给
Syncable
模型对象
Synchronizer
方法将使用
Syncable
界面直接对模型对象的共享、同步相关字段进行操作,并委托对特定类型字段的操作。或者,我可以为每个模型对象提供自己的
同步器
实例


试图找到正确的方法来克服继承限制确实是在扩展我的OOP技能。。。谢谢你的帮助

当我发现
RealmObject
应该直接从
RealmObject
类继承时,我也遇到了同样的问题(不支持继承)。 为了恢复多态性的好处,我考虑了与您类似的解决方案,并结合了一些组合技巧,以避免属性重复

“谈话很便宜,告诉我代码。”

代码示例 一些好处 您不必在每个扩展类中复制属性

你回来了!例如,现在可以模拟强制转换(在本例中使用getPerson()

一些限制 当使用使用反射的序列化库(假设是Gson)时,序列化模型将嵌入其父属性。如果您使用的是经典继承,那么您就不会拥有这些东西

JSON示例 假设约翰·多伊每月挣500美元。(他是个工人,对吧?)

对于经典继承,John Doe的外观如下:

{
  "name":"John Doe",
  "salary": 500
}
但是有了这个继承解决方案…:

{
  "person" : {
  "name":"John Doe"
  },
  "salary": 500
}
希望这有帮助

注 不幸的是,主密钥必须重复

奖金
您可能需要检查由“使领域查询更加类型安全”创建的库。

如果使用Kotlin,通过接口共享字段将变得更加简单:

interface PersonBase {
    var name: String?
    var salary: Int
}
然后


需要考虑的是——如果它不支持您需要的功能,也许您应该使用另一个支持该功能的库?您可以按照四人帮(设计模式)和Joshua Bloch(有效Java)的建议使用组合而不是继承。作为旁注,我们正在考虑允许继承,但它只能在对象建模时使用,而不能在查询时使用,这会让它感觉很糟糕。你对此有什么看法?@Emanuelez我很难弄清楚构图在这里有什么帮助。。。您是否建议我将每个对象拆分为域中的两个记录—一个用于共享字段,另一个用于特定类型的字段?据我所知,查询的局限性听起来确实很严重。查询抽象模型在iOS上有效,对吗?安卓系统有什么问题?不,它在iOS上不工作。他们面临着同样的限制。也许我不明白什么是查询问题。。。我们在iOS上使用模型继承,它可以按预期工作。限制是共享字段上的查询不能返回继承类型的混合吗?如果是这样的话,就我们的目的而言,这是完全正确的:我们几乎总是一次处理一个继承的类型;当我们确实需要对所有继承的类型应用一个操作时,我们会对每个类型进行单独的查询。当然,维护一个继承类型的列表是很难看的,但实际上,拥有共享字段和功能的代价很小……我如何将这个对象存储在另一个领域对象中?说我有:界面动物。狗类:动物。类别猫:动物。我有一个领域对象人类有一个宠物对象,我可以这样做:人类->(has-a)宠物:动物吗?@UpsideDownTree继承不是领域固有的。我的解决方法是添加一个成员类RealmObject pet,并对该属性的setter/constructor进行运行时类型检查(确保它是Dog类的实例)。
interface PersonBase {
    var name: String?
    var salary: Int
}
class Person: RealmObject(), PersonBase {
}