2014-06-09 3 views
1

와 DEF를 무시하는 것은 예를 들어 다음과 같은 고려 :스칼라 : 발

abstract class Item { 
    def price: Double 
    def description: String 
} 

class SimpleItem1(override val price: Double, override val description: String) extends Item{}  
class SimpleItem2(val price: Double, val description: String) extends Item{} 

성공적으로 컴파일하고 모두 확장 클래스는 같은 방법이있다. 그들은 실제로 같은가요? 그렇지 않다면 - 차이점은 무엇입니까? 그렇다면 - 예를 들어, 조금 설명해주십시오. 왜 '오버라이드'를 선택하지 않았습니까?

답변

9

pricedescriptionItem에서 추상이므로 override 수정자를 사용할 필요가 없습니다. 기본 구현이있는 경우 override 수정자를 추가해야합니다.

따라서 SimpleItem1에서 수정자는 불필요합니다. "상황에 맞게"override을 추가하는 것이 적절한 경우도 있습니다. 예를 들어 기본 구현이있는 클래스에 혼합 할 수있는 특성을 정의하는 경우입니다. 일반적으로

trait Item0 { 
    def price: Int 
} 

trait Item1 extends Item0 { 
    def price = 33 
} 

trait Item2 extends Item0 { 
    override def price = 33 
} 

object Foo1 extends Item1 // ok 
object Foo2 extends Item2 // ok 
object Foo3 extends Item0 with Item1 // ok 
object Foo4 extends Item2 with Item1 // NOPE! 
object Foo4 extends Item1 with Item2 // aha! 

당신이 가능한 override을 사용하지 않아야합니다 : 여기


override 차이를 만들 것 예이다.

+6

마지막 문장을 제외하고는 답변입니다. 'override'를 쓰지 않아도되는 이점은 없으므로, 코드를 훨씬 더 명확하고 미래의 추가를 위해 더욱 안전하게 만드는 데 도움이됩니다. 일부 저장된 키 스트로크는 방해가 될만한 가치가 없습니다 (예는 코드 작성 방법에 대한 좋은 예입니다). – sschaef

+1

@sschaef - 과부하로 인해 작동하지 않는 것이 좋은 디자인이라고 생각합니다. 나는 드물게 과부하를 사용해야하며, 나는 아무것도 놓치고 있다고 느끼지 않는다. 오버로드와 함께 작동하는 Swing과 같은 프레임 워크가 있지만, 일반적으로 클래스를 디자인하면이를 사용하지 않고 수행 할 수 있어야합니다. –

+0

@ 0__ - 나는 sschaef가 의미하는 바를 생각한다. "문장을 무시할 때마다 덮어 쓰기를 써야한다. 구문이 허용된다 할지라도이 단어를 건너 뛰면 안된다." 그리고 당신의 마지막 문장이 조금 혼란 스럽기 때문에 그는 그것을 썼습니다. 나는 개인적으로 그것을 이해한다 : "당신이 재치를 무시할 때, 당신이 할 수있는 경우에"오버라이드 "단어를 사용하지 말라. 아직도 나는 무엇이 의미하는지에 관해서 틀릴지도 모른다. :) – GrayR