Scala mixin для экземпляра класса - PullRequest
3 голосов
/ 31 октября 2011

Возможно ли в Scala создать какой-нибудь миксин для экземпляра класса?

Например: у меня есть экземпляр MyClass var x = new MyClass, и я хочу расширить его на некоторый метод или черту, не копируя его.

[Edit:] Я ищу способ продлить x после его создания.Так, например, в методе функции, который получает x в качестве параметра.

[Что позади] Мне просто интересно, есть ли какая-то магия с неявными объектами и манифестом для достижения шаблона класса типов без явного вызова неявного объекта (как в Haskell).Но только для одного объекта.

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

Ответы [ 3 ]

3 голосов
/ 31 октября 2011

Вы имеете в виду, как:

val x = new MyClass with MyTrait

Да, вы можете.Просто переопределить методы, очевидно, может быть:

val x = new MyClass { 
  override def myMethod = { my implementation }
} 
1 голос
/ 18 апреля 2012

Просто столкнулся с этой проблемой, так как мне было интересно то же самое ...

case class Person(name: String)
val dave = Person("Dave")
val joe  = Person("Joe")

trait Dog { val dogName: String }
val spot = new Dog { val dogName = "Spot" }

implicit def daveHasDog(p: dave.type) = spot

dave.dogName //"Spot"
joe.dogName  //error: value dogName is not a member of Person

Так что теперь dave экземпляр (а не все экземпляры класса Person) ведет себякак Person with Dog, пока неявное находится в области видимости.

Это будет работать в большинстве случаев, за исключением случаев, когда ваша черта имеет собственные типы.

0 голосов
/ 03 ноября 2011

Это невозможно. Вы можете взглянуть на использование Dynamic trait или плагина прокси-сервера Кевина Райта , но в любом случае вы создадите новый объект, который также ответы на оригинальный метод через прокси.

...