Вызов метода для суперкласса в самотипизированной черте в scala - PullRequest
21 голосов
/ 27 июля 2011

Я пытаюсь создать признак, который при смешивании заменит определение метода по умолчанию на то, которое вызывает исходный метод, а затем манипулирует результатом.

Вот что я пытаюсьделать:

class Foo {
  def bar() : String = "Foos bar"
}

trait OtherStuff {
  self : Foo =>
  def bar() : String = self.bar() + " with OtherStuff"
}

class Quux extends Foo with OtherStuff

Если бы это работало так, как я хотел, то (new Quux).bar теперь вернуло бы Foos bar with OtherStuff.К сожалению, это не работает так - я получаю:

<console>:6: error: error overriding method bar in class Foo of type ()String;
 method bar in trait OtherStuff of type ()String needs `override' modifier
       class Quux extends Foo with OtherStuff

Но если я использую override при определении OtherStuff, я получаю:

<console>:7: error: method bar overrides nothing
         override def bar() : String = self.bar() + " with OtherStuff"

IsЕсть ли возможность переопределить метод в самостоятельном типе с использованием черты?Если нет, то изменится OtherStuff на черту, которая extends Foo вместо того, который имеет собственный тип Foo, сделает что-то плохое для всего существующего кода, говоря что-то вроде

class WhatEver extends Foo with Xyz with Pqr with OtherStuff with Abc

Я работаю в scala 2.7.7, потому что это правило сборки sbt, и мы еще не обновили наш проект sbt до версии 0.10.x.(Плагины, от которых мы зависим, еще не готовы)

Ответы [ 2 ]

30 голосов
/ 27 июля 2011

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

trait OtherStuff extends Foo {                                
  abstract override def bar() = super.bar() + " with OtherStuff"
}

Тогда class Quux extends Foo with OtherStuff делает то, что вы хотите.

Эта статья может представлять интерес.

0 голосов
/ 04 марта 2014

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

class Foo {
  def bar() : String = "Foos bar"}
trait OtherStuff {
  self : Foo =>
  def bar( s : String) : String = self.bar() + s}

class Quux extends Foo with OtherStuff
(new Quux).bar(" with other stuff")

Дело в том, что с аннотацией типа "само", другие вещи, определенные в OtherStuff, являются частью Foo, когда Trait смешивается с Fooа не отношения подтипа.

...