[SCALA] 무엇 * 너무 *의 경우 클래스 상속 문제?
SCALA무엇 * 너무 *의 경우 클래스 상속 문제?
다른 뭔가를 찾고 있지만, 상당히 밖으로 단순한 우연의 일치 나는 클래스 상속이 얼마나 극악 무도 한 사건에 대해 몇 가지 의견을 우연히 발견. ProductN, 마저 왕, 엘프 마법사와 매우 바람직한 재산의 일부 종류의 케이스 클래스 상속과 손실 방법이라는 것은 있었다. 그래서이 경우 클래스 상속 그렇게 잘못인가?
해결법
-
==============================
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.즉 전반적으로 사실이 아니다. 그리고 이것은 거짓말보다 더 나쁜 것입니다.
즉 전반적으로 사실이 아니다. 그리고 이것은 거짓말보다 더 나쁜 것입니다.
(시도는 다음이 색상이 존재하지 않기 때문에 일치하지 않습니다 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) = ???
from https://stackoverflow.com/questions/11158929/what-is-so-wrong-with-case-class-inheritance by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라 2.8 CanBuildFrom (0) | 2019.11.08 |
---|---|
[SCALA] 스칼라 함수 리터럴은 무엇인가? (0) | 2019.11.08 |
[SCALA] <: 스칼라 <연산자 (0) | 2019.11.08 |
[SCALA] 배와 foldLeft 또는 foldRight의 차이? (0) | 2019.11.08 |
[SCALA] 자바 8 스칼라의 어느 동등한이 있습니까? (0) | 2019.11.08 |