kotlin 不允许 data class 作为父类是不是限制得有点太严格了?

2021-05-26 10:20:05 +08:00
 Newyorkcity
data class Person(val name:String,val age:Int);
data class Student(val name:String,val age:Int,val sid:Long);

如果允许继承的话可以少写 val name:String,val age:Int 而且这里也确实存在父子类对应的逻辑关系啊。 另外如果在业务里还有 Teacher,Doctor……之类很多的话,重复的代码也就更多了。

不太理解这一限制

1537 次点击
所在节点    问与答
5 条回复
timethinker
2021-05-26 10:39:46 +08:00
没有用过 kotlin,不过看似这个东西在语言层面有点类似于 C/C++的结构体?那么正确的做法应该使用组合而不是继承吧。

如果确实有继承的需求,那么为何不直接用 class 呢?子类行为可以复用 /改写父类行为,实现多态的效果,这才是使用继承的主要原因吧。因为最终还是跑在 JVM 上,个人猜测这里不允许继承可能是因为 equals 或者 hashcode 可能会出现问题?
hello1996
2021-05-26 10:47:12 +08:00
不用纠结,不用就好了,data class 纯属鸡肋
timethinker
2021-05-26 10:48:06 +08:00
查到了文档,楼主可以参考一下: https://kotlinlang.org/docs/whatsnew11.html#sealed-and-data-classes
secretman
2021-05-26 11:34:06 +08:00
官方:

为了确保生成的代码的一致性以及有意义的行为,数据类必须满足以下要求:

主构造函数需要至少有一个参数;
主构造函数的所有参数需要标记为 val 或 var ;
数据类不能是抽象、开放、密封或者内部的;
(在 1.1 之前)数据类只能实现接口。
secretman
2021-05-26 11:38:22 +08:00
Stack Overflow 高分答案:

The truth is: data classes do not play too well with inheritance. We are considering prohibiting or severely restricting inheritance of data classes. For example, it's known that there's no way to implement equals() correctly in a hierarchy on non-abstract classes.

So, all I can offer: don't use inheritance with data classes.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/779243

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX