2014-09-28 3 views
0

Я пытаюсь передать состояние объекта «наружу», поэтому его можно восстановить позже, передав его обратно, но не раскрывая частное состояние внешнему миру , В Java, я мог бы сделать это с внутренним классом:Доступ к частному полю внутренних классов

class Walker { 
    class State { 
     private int pos; 

     private State (int p) { 
      pos = p; 
     } 
    } 

    private int pos = 0; 

    State setState() { 
     return new State(pos); 
    } 

    void setState (State s) { 
     pos = s.pos; 
    } 
} 

Однако, если я пытаюсь то же самое в Scala, он говорит, что Уокер # SetState не могут получить доступ к государственным # позам.

class Walker { 
    private var pos = 0 

    def state = new Walker.State(pos) 
    def state_= (s: Walker.State) { 
    pos = s.pos 
    } 
} 

object Walker { 
    class State (private val pos: Int) 
} 

Как архивировать то же, что и на Java? (Другие, что клонирование объекта)

ответ

2

В Scala каждый внешний класс instace имеет собственный тип внутренних классов, которые означают outer1.inner.getClass = outer2.inner.getClass.
Неясно из вашего вопроса, если вам нужно, чтобы у вас был такой же класс состояний для всех ходоков (например, для назначения walker1 state to walker2), или нет. Я предполагаю, что вы хотите, чтобы у него был такой же тип класса. Все, что вам нужно, так это определение государства в объекте компаньона Walker как частное [Walker]:

class Walker { 
    private var pos = 0 

    def state = new Walker.State(pos) 
    def state_= (s: Walker.State) { 
    pos = s.pos 
    } 
} 
object Walker { 
    class State (private[Walker] val pos: Int) 
} 

val w1 = new Walker        //> w1 : demos.Walker = [email protected] 
val w2 = new Walker        //> w2 : demos.Walker = [email protected] 
w1.state = w2.state 

Что она делает это определение поз государства как частные всем, кроме Уокера. Подробнее об этом here.

Если вам не нужно государство, чтобы быть таким же между экземплярами Walker, то вы можете переместить определение состояния в самом класс с областью видимости внешнего класса: private[Walker] class State (private[Walker] val pos: Int)

+0

Спасибо! Раньше я не знал об этом частном синтаксисе [Что-то]. Я также даже не рассматривал вопрос, может ли '' Уокер'' обменять '' Государство''. – edave

2

Smiply объявить класс Sate внутри класса Walker:

class Walker { 
    class State(pos: Int) { 
     // other functionnalities 
    } 
    // use State 
} 
+0

Извините, но я до сих пор не видит любой доступ к точке внутри Уокера. Кроме того, не объявляет класс внутри другого класса заставлять Scala создавать новый класс State для каждого экземпляра Walker? (Согласно [this] (https://weblogs.java.net/blog/cayhorstmann/archive/2011/08/05/inner-classes-scala-and-java)) – edave

+0

Это не сработает, так как Walker не имеют доступа к другим частным классам (включая внутренние), если вы не определяете область – roterl

+0

. Я действительно не понимаю, почему ... Я имею в виду основную точку, которую эти модификаторы доступа это скрывать детали реализации, не так ли? Почему класс скрывает детали реализации от своих собственных внутренних классов? – edave

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