2013-04-19 40 views
15

Nie jestem pewien, jaki jest cel słowa kluczowego override w scala. Jeśli mamScala: jaki jest cel "przesłonięcia"

trait Shape { def foo(v: Int) } 
class Triangle extends Shape { override def foo(v: Int) {} } 

zachowuje się (przynajmniej pozornie) dokładnie tak samo jak ma to miejsce bez override.

Odpowiedz

38

W przypadku, gdy wdrożenie metody abstrakcyjne jak w przykładzie, to nie jest to bezwzględnie konieczne, aby dodać modyfikator override.

Jednak w przypadku, gdy chcesz override konkretnej metody z nadklasy, konieczny jest modyfikator override. Ma to na celu uniknięcie przypadkowych przesłonięć, które mogą wystąpić przy mieszaniu kompozycji - cechy mieszania podczas pewnego refaktoryzacji mogłyby z łatwością wprowadzić definicję metody, która mogłaby zostać nadpisana przez metodę zdefiniowaną w ciele klasy, stąd potrzeba wyraźnego stwierdzenia, że Metoda to nadpisanie.

6

Służy do sprawdzania błędów.
Załóżmy, że masz

trait Shape { def foo(v: Int) = 1 } 
class Triangle extends Shape { override def foo(v: Int) = 2 } 

a następnie zmienić kształt

trait Shape { def bar(v: Int) = 1 } 

W tym przypadku „override” powie, że foo w Triangle zadajnikami nic.

Zobacz także:
http://docs.oracle.com/javase/7/docs/api/java/lang/Override.html
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final

+0

To tylko poprawne, jeśli metoda, która została nadpisana, była abstrakcyjna, patrz odpowiedź axel22 s. Ponadto, oba twoje linki są nieistotne, ponieważ odnoszą się do Javy i C++, a nie Scali w szczególności. – Cubic

+1

Sześcienny, nie ma znaczenia, czy przesłonięta metoda jest abstrakcyjna, może się zmieniać z czasem. Zmiana interfejsu, nadpisanie pomaga pozostać w zgodzie. – ArtemGr

+0

Twoja odpowiedź oznacza, że ​​słowo kluczowe "override" zachowuje się tak samo jak adnotacja '@ Override' w Javie. Jest to poprawne tylko w przypadku nadpisywania abstrakcyjnych metod. – Cubic

19

W konkretnym przypadku masz kompleksową odpowiedź od axel22. Chcę tylko dodać, że istnieje co najmniej jeszcze jeden przypadek, w którym możesz napotkać modyfikator nadpisania. Słowo kluczowe może być również używane z metodami cech.

Wyobraź sobie, że masz klasę abstrakcyjną:

abstract class Writer { 
    def print(str: String) 
} 

i jego konkretną implementację, która drukuje na konsoli

class ConsoleWriter extends Writer { 
    def print(str: String) = println(str) 
} 

Teraz chcesz utworzyć cechę, która będzie zmodyfikować swoje zachowanie. Spójrz na poniższy realizacji:

trait Uppercase extends Writer { 
    abstract override def print(str: String) = 
    super.print(str.toUpperCase()) 
} 

Zauważmy, że metoda ma dwa modyfikatory: streszczenie i zastąpić.To jest dozwolone tylko dla cech i oznacza to, że cecha należy mieszać do jakiejś klasy, który ma konkretną definicję metody mowa

Z powyższej definicji, można zrobić:

val writer = new ConsoleWriter with Uppercase 
writer.print("abc") 

który będzie uzyskując wynik

ABC

dużo w ten sam marne, można dodać więcej cech:

trait WithSpaces extends Writer { 
    abstract override def print(str: String) = 
    super.print(str.split("").mkString(" ").tail) 
} 

Teraz kiedy zadzwonić

val writer = new ConsoleWriter with Uppercase with WithSpaces 
writer.print("abc") 

widać:

ABC

Powyższe użycie modyfikatora wymuszenia w cech jest wyróżnikiem w Scala i nie będzie widać go w Jawa.