복붙노트

[SCALA] 무엇 * 너무 *의 경우 클래스 상속 문제?

SCALA

무엇 * 너무 *의 경우 클래스 상속 문제?

다른 뭔가를 찾고 있지만, 상당히 밖으로 단순한 우연의 일치 나는 클래스 상속이 얼마나 극악 무도 한 사건에 대해 몇 가지 의견을 우연히 발견. ProductN, 마저 왕, 엘프 마법사와 매우 바람직한 재산의 일부 종류의 케이스 클래스 상속과 손실 방법이라는 것은 있었다. 그래서이 경우 클래스 상속 그렇게 잘못인가?

해결법

  1. ==============================

    1.한 마디 : 평등

    한 마디 : 평등

    케이스 클래스는 등호와 hashCode의 제공된 구현되어 있습니다. 등호로 알려진 등가 관계 (즉, 다음과 같은 속성을 가지고 있어야합니다)과 같이 작동합니다 :

    즉시 당신은 당신이 하찮게 다음의 예에 의해 입증되고 2, 3 깰 수 계층 구조 상속 내 어떤지를 허용하기 :

    case class Point(x: Int, y: Int)
    case class ColoredPoint(x: Int, y: Int, c: Color) extends Point(x, y) 
    

    그리고 우리는이 :

    Point(0, 0) equals ColoredPoint(0, 0, RED)
    

    하지만

    ColoredPoint(0, 0, RED) equals Point(0, 0)
    

    당신은 모든 클래스 계층이 문제가있을 수 있다고 주장 수도, 이것은 사실이다. 그러나 경우 클래스는, (다른 이유들) 개발자의 관점에서 단순화 평등에 특별히 존재 때문에 그들이 자신의 목표의 정의 될 비 직관적으로 행동 가지고!

    뿐만 아니라 다른 이유가 있었다; 예상 패턴 매처과의 상호 작용으로 복사가 작동하지 않았다 특히 사실.

  2. ==============================

    2.즉 전반적으로 사실이 아니다. 그리고 이것은 거짓말보다 더 나쁜 것입니다.

    즉 전반적으로 사실이 아니다. 그리고 이것은 거짓말보다 더 나쁜 것입니다.

    (시도는 다음이 색상이 존재하지 않기 때문에 일치하지 않습니다 ColoredPoint로 포인트를 일치하는 경우) 패턴 매칭이 어떤지 정확히 작동해야하기 때문에 평등을 다시 정의해야 정의 영역을 수축 어떤 경우 클래스 후계자에 aepurniet에서 언급 한 바와 같이.

    경우 클래스 계층 구조의 평등을 구현하는 방법을 이해하는 그 제공합니다.

    case class Point(x: Int, y: Int)
    case class ColoredPoint(x: Int, y: Int, c: Color) extends Point(x, y)
    
    Point(0, 0) equals ColoredPoint(0, 0, RED)  // false
    Point(0, 0) equals ColoredPoint(0, 0, null) // true
    
    ColoredPoint(0, 0, RED) equals Point(0, 0)  // false
    ColoredPoint(0, 0, null) equals Point(0, 0) // true
    

    결국은 (평등의 무시하지 않음) 경우에도 클래스 후계자 동등 관계의 조건을 만족시킬 수있다.

    case class ColoredPoint(x: Int, y: Int, c: String)
    class RedPoint(x: Int, y: Int) extends ColoredPoint(x, y, "red")
    class GreenPoint(x: Int, y: Int) extends ColoredPoint(x, y, "green")
    
    val colored = ColoredPoint(0, 0, "red")
    val red1 = new RedPoint(0, 0)
    val red2 = new RedPoint(0, 0)
    val green = new GreenPoint(0, 0)
    
    red1 equals colored // true
    red2 equals colored // true
    red1 equals red2 // true
    
    colored equals green // false
    red1 equals green // false
    red2 equals green // false
    
    def foo(p: GreenPoint) = ???
    
  3. from https://stackoverflow.com/questions/11158929/what-is-so-wrong-with-case-class-inheritance by cc-by-sa and MIT license