Как вызвать 'super ()' из вторичного конструктора в kotlin? - PullRequest
2 голосов
/ 20 января 2020

Я только что начал использовать kotlin, и у меня есть блок кода в java, который я должен преобразовать в kotlin. Это код java:

public class NonSwipeableViewPager extends ViewPager
{
    public NonSwipeableViewPager(Context context) {
        super(context);
        setMyScroller();
    }

    public NonSwipeableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        setMyScroller();
    }

    private void setMyScroller() {
        //some code
    }
}

Если бы в этом коде был только один конструктор, я мог бы написать так:

class NonSwipeableViewPager(context: Context): ViewPager(context) {

     init {
         setMyScroller()
     }

     private fun setMyScroller() {
         //some code
     }
 }

Но так как есть два конструктора и каждый конструктор вызывает метод super(), я не мог понять, как я могу преобразовать этот код в kotlin. Самое близкое, чего я достиг, это:

class NonSwipeableViewPager(context: Context): ViewPager(context) {

     init {
         setMyScroller()
     }

     constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs) {
         setMyScroller()
     }

     private fun setMyScroller() {
         //some code
     }
 }

Но в этом коде я получаю следующую ошибку в этой строке super(context!!, attrs): primary constructor call expected Итак, как я могу вызвать super() из вторичный конструктор?

Ответы [ 2 ]

1 голос
/ 20 января 2020
class NonSwipeableViewPager: ViewPager {

    init {
        setMyScroller()
    }

    constructor(context: Context) : super(context)
    constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)

    private fun setMyScroller() {
        //some code
    }
}

Обратите внимание, что ни один вторичный конструктор не требует вызова setMyScroller(), поскольку блок init будет вызываться сразу после вызова super.

0 голосов
/ 20 января 2020

Измените свой код следующим образом

class NonSwipeableViewPager : ViewPager {
    constructor(context: Context?) : super(context!!) {
        setMyScroller()
    }

    constructor(context: Context?, attrs: AttributeSet?) : this(context) {
        setMyScroller()
    }

    private fun setMyScroller() { //some code
    }
}

вместо

 class NonSwipeableViewPager(context: Context): ViewPager(context) {

     init {
         setMyScroller()
     }

     constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs) {
         setMyScroller()
     }

     private fun setMyScroller() {
         //some code
     }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...