添加抽象私有getter和public setter的正确方法是什么?

时间:2017-06-26 17:44:41

标签: kotlin

我有一个界面,我想要一个可以在课堂内修改但不在外面的属性。我不能使用val,因为它需要是可变的,并且var关键字不能有指定的私有setter,因为它在接口中。

在java中,我会这样做:

public <T> getMyProperty();

我可以在kotlin中使用相同的方法,只是直接编写getter函数,但这似乎不像kotlinlike方法。有没有比这更好的方法来实现? 有趣的getMyProperty()

1 个答案:

答案 0 :(得分:11)

在Kotlin中,您实际上override val var interface Iface { val foo: Foo } ,因此,我认为,您想要的内容可以表达如下:

class Impl : Iface {
     override var foo: Foo
         get() = TODO()
         private set(value) { TODO() } 
}

val

或者您可以使用具有支持字段和默认访问者的属性覆盖class ImplDefaultGetter : Iface { override var foo: Foo = someFoo private set }

import { Observable } from 'rxjs';

var numbers = [5, 1, 2, 7, 10];
// let source = Observable.from(numbers);
let source = Observable.create(observer => {
    for (let n of numbers)
        observer.next(n);

    observer.complete();

});

source.subscribe(
    value => console.log(`value is ${value}`),
    error => console.log(`error is ${error}`),
    () => console.log(`completed!`)
);

setTimeout(function () {
    console.log("pushing new value");
    numbers.push(33);
}, 3000);

在这两种情况下,可变性和私有setter的存在都成为类的实现细节,不会通过接口公开。