2012-02-10 2 views
2

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

class Foo(a: Int) 

class Bar(b: Buffer[Int]) extends Foo (sum) { 

    def sum = (1 /: b)(_ + _) 

} 

почему это жалуются на вызов метода sum из конструктора? Невозможно ли вообще такое поведение при такой простой реализации? Я понимаю, что я мог бы создать объект-компаньон для Bar, но это не совсем то, что я должен был сделать?

PS нет 'superconstructor' тег)))

UPDATE: Каковы возможные альтернативы?

ответ

3

Каждый раз, когда строится экземпляр Bar, все его элементы добавляются к нему. Только после завершения строительства вы можете позвонить своим членам.

+0

Хорошо, но какие альтернативы? – noncom

+1

Вы можете 'class Bar (b: Buffer [Int]) расширять Foo ((1 /: b) (_ + _))'. –

1

если sum не вызывается на экземпляр Bar - это не так, поскольку он еще не построен! - тогда его место определенно не внутри Bar. Если Bar является его единственным пользователем, то естественным местом для него является объект-компаньон.

Более интересный вопрос - почему вы не хотите его в своем естественном месте?

+0

Существует следующий упрощенный пример: представьте, что у вас есть класс 'Rule', который представляет некоторое правило, применяемое к объекту в течение периода времени, который называется' duration'. Могут быть много детей этого класса, но я также хочу иметь детей, как «RuleChain» и «RuleParallel». Эти два класса могут содержать набор правил, выполняемых последовательно или одновременно, но обрабатываться точно как «Правило». Поскольку класс 'Rule' принимает' duration' как один из параметров, я должен передать сумму длительностей для цепочки и самую длинную продолжительность для параллелизма, поэтому я должен вызвать некоторый метод. – noncom

+1

@noncom Я не понимаю, почему вы чувствуете, что этот метод должен находиться в классе, а не на объекте, поскольку он не относится к экземпляру. –

+0

Да, вы правы, я просто привык думать так на Java, где не было большой разницы. Здесь Scala обеспечивает более строгую заботу о дизайне приложения, и теперь я считаю ее более правильной. Имея это в виду, очевидно, что объект-компаньон является лучшим местом для таких методов. – noncom

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