2012-10-12 25 views
50

Widzę, że cechy w Scali są podobne do interfejsów w Javie (ale interfejsy w Javie rozszerzają inne interfejsy, nie rozszerzają klasy). Widziałem an example on SO about traits usage, gdzie cecha rozszerza klasę.Dlaczego cecha Scala może rozszerzać klasę?

Jaki jest tego cel? Dlaczego cechy mogą rozszerzać klasy?

+1

Po przeczytaniu odpowiedzi, którą połączyłeś, zobaczysz, że cechy są bardzo różne od interfejsów, ponieważ mogą zawierać implementacje. –

+2

Możesz również być zainteresowany różnicami między cechami dziedziczenia a adnotacjami typu self: http://stackoverflow.com/questions/1990948/what-is-the-difference-between-scala-self-types-and-trait- podklasy –

+0

Tak, rozumiem, że cechy, w przeciwieństwie do interfejsów, mogą zawierać częściową implementację metod, ale nie byłem pewien co do celu cech rozszerzających klasy (jak wyjaśniono w przykładzie). – Raj

Odpowiedz

65

Tak oni puszki, trait który rozciąga się class stawia ograniczenie co classes może przedłużyć ten trait - mianowicie, że wszyscy classes mix-in, który trait musi rozciągać się, że class.

scala> class Foo 
defined class Foo 

scala> trait FooTrait extends Foo 
defined trait FooTrait 

scala> val good = new Foo with FooTrait 
good: Foo with FooTrait = [email protected] 

scala> class Bar 
defined class Bar 

scala> val bad = new Bar with FooTrait 
<console>:10: error: illegal inheritance; superclass Bar 
is not a subclass of the superclass Foo 
of the mixin trait FooTrait 
     val bad = new Bar with FooTrait 
          ^
+13

Interesujące. Ale można również ograniczyć klasy, w których można mieszać cechę, wprowadzając ograniczenie typu w typie własnym, np. 'trait FooTrait {self: Foo =>}'. Kiedy używałbyś jednej techniki w porównaniu do drugiej? – AmigoNico

+0

Scala robi się szalona z powodu pisania na klawiaturze. Z pewnością widzę, że może to być całkiem przydatne, ale czy ktoś może podać konkretne przykłady? –

+1

@AmigoNico [tutaj] (http://stackoverflow.com/q/36945333/2032064) jest jednym z przykładów, kiedy możesz preferować dziedziczenie z klasy. – Mifeet

Powiązane problemy