2016-08-23 3 views
0

У меня есть следующий метод:Есть ли способ переопределить и добавить некоторые импликации в метод?

class TestBase { 
    def base(value: Int) = println(value) 
} 

Теперь, я хотел, чтобы переопределить его и добавить некоторую функцию, выполняя побочный эффект, который предполагается ввести в сферу каждого абонента. Я имею в виду, что вызывающий может решить, какой побочный эффект добавить. Я пробовал вот так:

class TestDerived extends TestBase{ 
    override def base(value: Int)(implicit ev : Int => Unit) = println("Overriden") 
          //Error, Method 'base' overrides nothing 
} 

Но этот код отказывается компилироваться. Я подозревал, но не знал, что если implicits являются частью подписи метода. Итак, есть ли другой способ позволить вызывающему абоненту предоставить собственную версию функции побочного эффекта. Причина, по которой я не могу просто добавить неявный параметр в базовый класс, заключается в том, что я использую akka.Actor, и я не могу изменить подпись akka.actor.receive: Receive.

+1

В Scala и Java, разные подписи означают разные методы, так как ваш метод имеет другую подпись, он не может переопределить другой метод. –

+1

Просто интересно, если вы можете переопределить актер-приемник с неявным, как вы его назовете? вы отправляете сообщение актеру с подсказкой, а затем получаете вызывается самакой. –

+0

@FatihDonmez Ну, я просто предоставил значение для импликации с импортом. Что не так? – user3663882

ответ

2

Я не думаю, что это Возможное

Если я называю производной функции с помощью базового указателя:

val o: TestBase = new TestDerived 
o.base(1) 

Поскольку неявный параметр добавляется компилятором во время компиляции, но здесь только компилятор найдите сигнатуру базовой функции, поэтому компилятор не будет генерировать неявный параметр.

+0

Точный вызов, в моем случае, приводит к вызову реализации «TestDerived» и выбрасывает из-за отсутствия импликации в области. – sebszyller

+0

@sebszyller, пожалуйста, вставьте полный тестовый код? –

1

Можно добиться такого же поведения, но не путем переопределения метода. У вас есть несколько вариантов:

1. Переместите неявное конструктору

class TestDerived()(implicit ev: Int => Unit) extends TestBase { 
    override def base(value: Int) { 
    println("Overriden") 
    } 
} 

2. Оберните базовый метод в другом методе

class TestDerived() extends TestBase { 

    def base2(value: Int)(implicit ev: Int => Unit): Unit = { 
    // implement whatever logic you want here. 
    ev(base(value)) 
    } 
} 
+1

Наличие имплицитного в конструкторе кажется немного странным, поскольку оно ограничивает вас от выбора каких-либо других неявных позже. –

+1

@SarveshKumarSingh Просто подсвечивая возможные варианты, это не обычный случай использования, но он не самый необычный. – flavian

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