2013-04-19 14 views
15

Scala'da, override anahtar kelimesinin amacının ne olduğundan emin değilim. BenScala: 'geçersiz kılma' amacı nedir?

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

varsa o override olmadan yaptığı gibi (görünüşte en az) tam olarak aynı şekilde davranır.

cevap

38

Eğer soyut bir metodu kullanacağız. Ancak, override numaralı sınıfın üst sınıfından somut bir yöntem kullanmak istiyorsanız, override değiştiricisinin gerekli olması gerekir. Bu, karıştırma bileşimi ile meydana gelebilecek rastlantısal geçersiz kılmalardan kaçınmaktır - bazı yeniden düzenleme sırasında karıştırma-karıştırma özellikleri, sınıfın gövdesinde tanımlanan yöntemle geçersiz kılınabilecek bir yöntem tanımını kolaylıkla ortaya koyabilir, dolayısıyla açıkça bir yöntem bir geçersiz kılmadır.

6

Hata denetimi için.
Eğer

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

var ve sonra o durumda

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

için "geçersiz kılma" Şekli değiştirmek varsayalım söyleyecektir fooTriangle yılında geçersiz kılar şey olduğunu.

Ayrıca bakınız: override değiştirici eklemek için kesinlikle gerekli değildir sizin örnekte olduğu gibi
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

Yalnızca geçersiz kılınan yöntem soyutsa, bu doğrudur axel22 s yanıtına bakın. Ayrıca, her iki bağlantınız da alakasız çünkü Java ve C++, özellikle Scala için değil. – Cubic

+1

Kübik, geçersiz yöntemin soyut olup olmadığı önemli değil, bu zamanla değişebilir. Arayüz değişikliği, geçersiz kılma ayarda kalmaya yardımcı olur. – ArtemGr

+0

Yanıtınız, geçersiz kılma anahtar kelimesinin Java'daki '@ geçersiz kıl 'notu ile aynı davranacağını ima eder. Bu sadece soyut yöntemleri geçersiz kılarken geçerlidir. – Cubic

19

Özel durumunuzda, axel22'den kapsamlı bir yanıt aldınız. Sadece eklemek istiyorum, geçersiz kılma değiştiricisiyle karşılaşabileceğiniz en az bir durum var. Anahtar kelime, özellik yöntemleri ile de kullanılabilir.

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

Şimdi, onun davranışını değiştirmek bir özelliği oluşturmak istediğiniz bir konsolda yazdırır

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

ve somut uygulama:

özet bir sınıfı olduğunu düşünün. Aşağıdaki uygulanması bak: soyut ve geçersiz kılmayı: Bir yöntem iki değiştiricileri olduğunu

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

dikkat edin.Bu, yalnızca özelliklerin izin ve özellik, yapabileceğiniz yukarıdaki tanım ile

söz

yılında yöntemin somut bir tanıma sahip bazı sınıfa karışık gerektiği anlamına gelir edilir:

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

hangi edecek aynı boşuna

ABC

Çok sonucu verir, daha fazla özellikleri ekleyebilirsiniz:

trait WithSpaces extends Writer { 
    abstract override def print(str: String) = 
    super.print(str.split("").mkString(" ").tail) 
} 
Eğer göreceksiniz

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

çağrı Şimdi

:

ABC

özellikleri manuel kontrol değiştirici yukarıdaki kullanım scala bir ayırt edici özelliktir ve içinde görmez java.