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