如何在Kotlin的次构造函数中调用'super()'?

10

我刚开始使用 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)中遇到了以下错误:需要主构造函数调用。那么,我该如何从次要构造函数中调用super()呢?

2个回答

6
class NonSwipeableViewPager: ViewPager {

    init {
        setMyScroller()
    }

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

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

请注意,由于在super调用之后立即调用init块,因此两个辅助构造函数都不需要调用setMyScroller()

2
  1. 这里没有主构造函数,两个构造函数都是次要的;
  2. 两者都不需要调用,因为init块在两个构造函数之前被调用(但在super调用之后)。
- Alexey Romanov
谢谢@AlexeyRomanov,我已经更新了我的回答以反映这一点。 - Ryan

0
将您的代码更改为以下内容。
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
     }
 }

谢谢您的回答。我想我尝试过这段代码了。 但是,关于这行代码 super(context!!, attrs) 怎么办?即使我使用您的代码,我的问题仍然存在。 如何从第二个构造函数中调用 super() - Jayesh Babu
@JayeshBabu 这可能会对你有所帮助 链接 - Hasan Khan
另一个答案解决了我的问题。无论如何,谢谢。 - Jayesh Babu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接