2013-11-13 2 views
0

Скажем, у меня есть следующий класс в Java:Scala Наследование от выпуска ява инициализации

class A 
{ 
     public A() 
     { 
       init(); 
     } 

     void init() 
     { 
       System.out.println("A:init()"); 
     } 
} 

А потом я унаследовать от него в Скале следующим образом:

class B extends A { 

     var x = 3 

     override def init(): Unit = println("init: x = " + x) 
}  

Когда я построить экземпляр B значение для x в моем переопределении init не будет 3, конечно, поскольку оно еще не будет инициализировано на этом этапе. Если я не могу изменить класс java, кто-то может рекомендовать лучший подход здесь, чтобы обеспечить, чтобы поля моего класса были инициализированы при вызове init().

Благодаря

Des

+0

установить значение в методе init? – Taylor

+0

Вам действительно нужен _var_, или будет _val_ делать? –

ответ

0

Вы можете поместить эту переменную в объект компаньона, а затем просто сделать

override def init(): Unit = println("init: x = " + B.x)

где B объявлен так:

object B { 
    val x = 3 
} 

Вы все o может определить/инициализировать x внутри init().

+0

-1? Если x действительно нужно быть _var_, а не val, как было описано, то, помещая его в объект-компаньон, вероятно, не будет работать, поскольку он, вероятно, должен быть для каждого экземпляра. –

+0

Ну, так как 'x' должен быть инициализирован * перед экземпляром класса *, я предполагаю, что нельзя определить/инициализировать' x' другим способом. Кроме того, для этого есть обходной путь: вы можете сделать это так: 'def x = 3', чтобы вы могли получить начальное значение, а затем, если действительно необходимо, чтобы x был мутировался, просто нужно иметь другую переменную магазин. Но, на данный момент, я предполагаю, что основная идея OP заключается в получении некоторого * начального * значения, и это достигается с помощью «object» singleton. – tkroman

+0

Правильный Ed, я хочу, чтобы x был изменчивым, но с начальным значением. Вероятно, я должен был бы инициализировать() изменить x в приведенном выше примере, чтобы быть более понятным. В java это не будет проблемой, так как конструктор будет называться ПОСЛЕ инициализации элемента-члена. Я просто надеялся, что в скале это будет так аккуратно. – user79074

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