2013-08-16 7 views
0

Я изучаю Scala, и я пытаюсь перевести код какого-либо шаблона проектирования с Java на Scala, но я теряю некоторые детали.«Абстрактный класс не принимает параметры»: почему?

К примеру, сейчас я пишу простое государство но я получаю три вхождения одного и те же ошибки времени компиляции:

Это код

abstract class Statelike { 
    def writeName(STATE_CONTEXT : StateContext , NAME : String): Unit 
} 

class StateA extends Statelike { 
    override def writeName(STATE_CONTEXT : StateContext , NAME : String) : Unit = { 
     println(NAME.toLowerCase()); 
     STATE_CONTEXT.myState(new StateB) **//same error** 
    } 
}//end StateA 


class StateB extends Statelike { 
    var count = 0; 
    override def writeName(state_contest: StateContext , name: String) : Unit = { 
    println(name.toUpperCase()); 
    count+1; 
    var conto2 = count; 
    if (conto2 > 1) { 
     state_contest.myState(new StateA)  **//same error** 
    } 
    } 
}//StateB 

class StateContext { 

    var state : Statelike = null 

    def StateContext() { 
     myState(new StateA) **//same error** 
    } 

    def myState_=(s1 : Statelike) = {state = s1} 

    def myState : Statelike = state 

    def writeName (NAME : String): Unit = { 
     myState.writeName(this, NAME); 
    } 
}//end StateContext 

object TestClientState { 
    def main(args : Array[String]) { 
     var SC = new StateContext(); 

     SC.writeName("Monday"); 
     SC.writeName("Tuesday"); 
     SC.writeName("Wednesday"); 
     SC.writeName("Thursday"); 
     SC.writeName("Friday"); 
     SC.writeName("Saturday"); 
     SC.writeName("Sunday"); 
    } 
} 

В вхождениях ошибок:

State.scala:12: error: Statelike does not take parameters 
     STATE_CONTEXT.myState(new StateB) 
          ^
State.scala:26: error: Statelike does not take parameters 
      state_contest.myState(new StateA) 
           ^
State.scala:37: error: Statelike does not take parameters 
     myState(new StateA) 
      ^
three errors found 

чтение документа, ему нравится неправильное использование признаков, но я не использую черты!

StateA и StateB является классом реализации класса Statelike, что абстрактно. Нет больше, не меньше.

Где мой код ошибки? Слишком много наследования «Java-style»? Может быть решение Waht?

Заранее спасибо

+0

Я предполагаю, что вы ¨R пытается ФРО, делают методы получения и установки явно, попробуйте вместо 'state_contest.myState (новый StateA)' 'state_contest.myState = новый StateA' – 4lex1v

ответ

4

Компилятор недоумевает, что вы пытаетесь сделать здесь:

myState(new StateA) 

Ну ... Я тоже озадачен. myState - это метод без параметров.

def myState : Statelike = state 

Таким образом, вы могли бы переписать код так:

val ms: Statelike = myState 
ms(new StateA) 

Поскольку ms не метод последней строки (ms(new StateA)) является версией укоротить из ms.apply(new StateA). Но нет метода apply в классе Statelike.

Возможно, вы хотите позвонить в myState.writeName(new StateA) вместо myState.(new StateA), но для метода writeName не хватает параметров.

сеттер

Как уже упоминалось @AlexIv: Если вы пытаетесь вызвать сеттер, следует отметить, что это имя myState_=, не myState.

myState_=(new StateA) 

С синтаксическими:

myState = new StateA 
+0

Он пытается сделать геттеры и сеттеры явными, например, когда scalac desugars vals.Вместо 'myState (new StateA)' он должен написать 'myState = new StateA', beacuse' def myState _ = (s1: Statelike) = {state = s1} 'и в этом случае сделать' var state' private – 4lex1v

+0

2 моя ошибка: 1) _def StateContext() _: подпись os - это конструктор, иначе Java не должен объявлять явный конструктор. 2) Плохой вызов myState_, правильный код - class.myState _ = (/ * новое значение * /). Ihneritance is'nt проблема – alepuzio

+0

@alepuzio: 1) Да, 'def StateContext()' является распространенным методом, а не конструктором. Вы можете установить 'state':' var state: Statelike = new StateA'. И даже если вы не хотите устанавливать 'state', вы можете использовать' _' вместо 'null':' var state: Statelike = _'. '_' работает со всеми типами, а не только с AnyRef. – senia

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