2014-11-29 3 views
2

Вы можете вызвать вспомогательный конструктор базового класса с помощью производного класса основного конструктора:Как вызвать вспомогательный конструктор базового класса из вспомогательного конструктора производного класса в Scala?

class Base(n:Int) { 
    def this(n:Int, i:Int) = { 
     this(n) 
     println(i) 
    } 
} 

class Derived(n:Int, i:Int) extends Base(n, i) 

Есть ли синтаксис вызова вспомогательного конструктора базового класса из вспомогательного конструктора производного класса? Это не работает:

class Derived2(n:Int) extends Base(n) { 
    def this(n:Int, i:Int) = { 
     super.this(n, i) // Can't do this 
     println(i) 
    } 
} 

В других языках, вы можете сделать это, но вы должны вызвать базовый конструктор класса первый, поэтому я попытался сделать это здесь.

Обратите внимание, что я ищу синтаксис вызова, а не альтернативные способы достижения такого же результата.

+1

Я не поставили достаточно мысли в это, чтобы дать его как полный ответ, но, как я вижу, вам просто нужно сделать первичный конструктор имеет возможность всех поведений в конструкторах, которые вы хотите (потенциально сделанные частными, если это не раскрывает красиво), а вспомогательные просто делегируют это, если это необходимо. –

ответ

4

В Scala вам нужно пройти через конструктор по умолчанию, независимо от того, что заставляет вас выбрать одну супер-конструкцию в вашем экземпляре класса. Это в основном то, что вы пытаетесь сделать с точки зрения Java:

public class Derived2 extends Base { 
    public Derived2(int n, int i) { 
     super(n, i); 
    } 
    public Derived2(int n) { 
     super(n); 
    } 
} 

Поскольку в Scala вы должны пройти через конструктор по умолчанию это то, что происходит:

public class Derived2 extends Base { 
    public Derived2(int n, int i) { 
     this(n); 
     super(n, i); //does not compile 
    } 
    public Derived2(int n) { 
     super(n); 
    } 
} 

Так, как это обычно в Java вы можете вызвать только super или this в качестве первой строки реализации вашего конструктора. Поскольку Scala заставляет вызов конструктора по умолчанию, нет никакой возможности использовать только одну реализацию конструктора Base.

Нет работы вокруг, так как это не очень догматично Скала. Я бы предложил изменить ваш дизайн здесь. Наследование в Scala обычно осуществляется через черты, а не классы или абстрактные классы.

Вот что альтернатива может выглядеть с использованием признака:

trait Base2 { 
    val a:Int 
    } 

    class Derived3(n: Int) extends Base2 { 

    val a = n 

    def this(n: Int, i: Int) = { 
     this(n) 
    } 
    } 
+0

Это то, что я искал - «синтаксис не разрешен». Я все еще думаю, что это немного непоследовательно, что я могу вызвать ЛЮБЫЙ конструктор базового класса из конструктора первичного производного класса, но я не могу назвать ни одного из вспомогательного конструктора производного класса. Однако я не думаю, что это мешает желаемым результатам. – user1677663

 Смежные вопросы

  • Нет связанных вопросов^_^