2017-02-15 3 views
0

После некоторого количества прибегая к помощи я написал этот кодНаследование тематического класса от абстрактного класса без дублирования кода

abstract class Foo(val name: String) 
case class Bar(override val name: String, age : Int) extends Foo(name) 
def sayHello(f : Foo) = println(f.name) 
sayHello(Bar("bar", 10)) 

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

Интересно, существует ли сжатый способ написания кода выше.

+0

«так много дублирования кода между Foo и Bar». Вы имеете в виду объявление одного поля в 'Foo'? Я думаю, что это немного преувеличено. –

+0

Мне пришлось переопределить каждое поле Foo в баре (хотя Bar - это ребенок Foo), а затем я должен был передать все поля Foo во время расширений. Теперь здесь это может не выглядеть много. Но в реальной жизни у моего Foo было 8 полей, и код выглядел очень уродливо. –

ответ

2

Вы можете уменьшить количество дублирования, если вы сделаете name нормального поля в Foo вместо аргумента конструктора:

abstract class Foo { 
    val name: String 
} 

case class Bar(name: String, age: Int) extends Foo 
0

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

1

Вы можете создать зависимости класса/черт реальных без дублирования членов, но это делает конкретизацию более многословным поэтому я не уверен, что на самом деле он значительно сокращает количество кодов.

trait Foo {val name: String}   // has name 
class Bar(val age: Int) {self:Foo => } // has age 

def sayHello(f : Foo) = println(f.name) // unchanged 
sayHello(new Bar(10) with Foo{val name = "bob"}) 
Смежные вопросы