Kotlin中能否用var定义Getter返回Y、Setter私有且接收X的属性?
关于属性Getter/Setter类型匹配的问题解答
嘿,这个需求我之前在做面向对象设计的时候遇到过,咱们直接拆解来看:
你想要的是——内部存储的是X类型(X继承自Y),对外暴露的Getter返回Y类型,而设置这个值的入口是私有的,并且只能接收X类型。
先说结论:简单的自动属性(比如靠var推断或者默认的自动属性语法)是做不到的,原因很直白:
- 自动属性的Getter返回类型和Setter参数类型必须和属性的公开类型绑定。如果把属性公开类型设为
Y,那Setter的参数也会是Y,没法限制只能传X;如果设为X,Getter就会返回X(虽然它兼容Y,但不符合你要求Getter明确返回Y的需求)。
那该怎么实现呢?必须靠显式的字段+自定义访问逻辑,这里给你两种常用的方案:
方案1:显式字段+私有设置方法(最推荐)
这种方式在编译期就严格限制了输入类型,完全贴合你的需求:
// 以C#为例,其他OOP语言逻辑类似 // 内部存储用X类型 private X _internalProperty; // Getter对外返回Y类型 public Y MyProperty => _internalProperty; // 私有方法专门用来设置,只接受X类型 private void SetMyProperty(X newValue) { _internalProperty = newValue; }
方案2:显式字段+带校验的私有Setter
如果你更习惯用属性Setter的语法,也可以这么写,但需要在Setter里加类型校验——不过这种方式是运行时校验,不如方案1严谨,因为调用Setter时还是能传入任意Y类型的值(只是会报错):
private X _internalProperty; public Y MyProperty { get => _internalProperty; private set { if (value is not X validValue) { throw new ArgumentException("传入的值必须是X类型"); } _internalProperty = validValue; } }
总的来说,方案1是更优的选择,既满足了类型限制,又避免了运行时的潜在问题。
内容的提问来源于stack exchange,提问作者Chen Kinnrot
相关产品推荐
相关产品推荐

