[SCALA] 왜 스칼라에서 def``와`var`을 무시하는 것은 불가능?
SCALA왜 스칼라에서 def``와`var`을 무시하는 것은 불가능?
var에가 서브 클래스와 반대의 반대에 발을 무시할 수없는 이유를 이해하는 동안, 나는 스칼라는 데프 하위 클래스에서 상위 클래스의 VAR을 무시할 수없는 이유를 이해 할 수없는입니다
class Car {
var age = 32
}
class SedanCar extends Car {
override def age = 54
}
허용하지 왜 var에 변경 가능한 같이 데프 그것을 무시하는? 사람이를 이해하는데 도움이 저를 기쁘게 할 수 있습니까?
해결법
-
==============================
1.그는리스 코프 치환 원칙에 관련이 : 당신이 (심지어 자바) 서브 클래스에 약한 액세스 권한을 할당 할 수 없습니다. 만들기 VAR a는 데프 세터 데프 X_ = (: T y)를 : 만드는 단위가 개인 (@Staix 말한대로). 그래서 경우에 때 Seadan 자동차 가형 자동차를 가지고 - 그것은 액세스 할 수 없습니다해야하지만 컴파일러는 너무 그런 행동은 어떤 약한 특권처럼 사용할 수 없습니다 일반 (컴파일 시간에 알려진 형식적인 유형), 이러한 경우를 찾을 수 없습니다 :
그는리스 코프 치환 원칙에 관련이 : 당신이 (심지어 자바) 서브 클래스에 약한 액세스 권한을 할당 할 수 없습니다. 만들기 VAR a는 데프 세터 데프 X_ = (: T y)를 : 만드는 단위가 개인 (@Staix 말한대로). 그래서 경우에 때 Seadan 자동차 가형 자동차를 가지고 - 그것은 액세스 할 수 없습니다해야하지만 컴파일러는 너무 그런 행동은 어떤 약한 특권처럼 사용할 수 없습니다 일반 (컴파일 시간에 알려진 형식적인 유형), 이러한 경우를 찾을 수 없습니다 :
val car2 = new SeadanCar car.age = 422 //compiler error, can't mutate "def age" val car: Car = new SeadanCar car.age = 42 //now you had mutated immutable
능성 원리의 핵심은 동작은 상위 유형으로 캐스팅 한 후 변경 될 수 없습니다입니다.
반면에 레지스 장 - 질 말했다 @로, 스칼라 변수의 게터 부분을 무시할 수 있지만 직관적으로 사용자가 VAR 데프 재정의 후 불변되고 기대 때문에, 그래서 확실한 해결책이 아니다. 당신이 UAP-호환성 (을) 반대를 요구하면서,이 개 서비스 (리더와 작가) 대신에 하나가 정말 같은 VAR을보고 가지고 그리고 실제로 통일 접근 원칙을 위반 한 것 : 모두 독자와 작가가 하나의 균일 한 표기법으로 표현되어야한다.
추신 스칼라의 UAP 호환성 불완전 실제로 질문을 가리 킵니다. 난 단지 VAR의 독자를 무시하고는 UAP과 일치하지 않습니다으로 작가를 떠나, 말했듯이 - 그것은 재정의 VAR 자체에 기능을 차단하는 것 (당신은 두 가지 방법으로 VAR 재정의 할 수 있습니다 : 계산 및 스토리지 등) 이미도에 관계없이 그, LSP 때문에 그것을 무시할 수 없습니다. 그러나 현재 스칼라의 솔루션은 문제가있다. 당신은 당신이 할 수있는 것을 알 수 있습니다 :
trait Car { def age: Int = 7; def age_=(a: Int) = {}} class SeadanCar extends Car { override def age: Int = 5}
그러나 수 없습니다
// just repeating your example trait Car { var age: Int = 7 } class SeadanCar extends Car { override def age: Int = 5}
스칼라의 상속 보인다 그래서하지 UAP와 호환 될 수 있습니다. (액세스하고 있지, 정의 할 때) 당신이 그들을 구별 할 수 있도록 - IMHO는 큰 문제 자체가 동일한 이름을 가지고 그 리더와 VAR입니다. 내가 좋아하는 뭔가를 해결할 것입니다 :
trait Car { def age_: Int = 7; def age_=(a: Int) = {}} class SeadanCarReadOnly extends Car { override def age: Int = 5} //can't compile as reader is closed class SeadanCarVar extends Car { override var age: Int = 5} class SeadanCarReadOnly extends Car { override def age_: Int = 5} trait Car2 { var age = 100500 } class SeadanCarReadOnly extends Car2 { override def age_: Int = 5}
참고, 내 제안 예에서 age_을 무시하는 것은으로 이어질 것을 :
scalaxx> (new SeadanCarReadOnly).age //call age_ here resxx: Int = 5 scalaxx> (new SeadanCarReadOnly).age_ resxx: Int = 5
좋아하지 않는:
trait Car2 { @BeanProperty var age = 100500 } class SeadanCarReadOnly extends Car2 { override def getAge: Int = 5} //which leads to inconsistency: scala> (new SedanCar()).age res6: Int = 30 scala> (new SedanCar()).getAge res7: Int = 54
cource 중, 이러한 접근 방식은 var에 나이와 데프 age_을 무시하지 않도록 설정해야합니다; DEF age_ 동시에 =
trait Car2 { var age = 100500 } class SeadanCarReadOnly extends Car2 { override var age = 17; override def age_: Int = 5 //should be compile error here }
하지만이 때문에 이전 버전과의 호환성에 신속 스칼라 언어로 그것을 구현하기 어렵다
질문의 가변성 / 불변성 부분에 대하여 만 언급에 P.S./2는, 당신은 확실히 (때문에 LSP로)이 작업을 수행 할 수 있습니다 :
trait Car { var age: Int = 32 } //or without initial value class SedanCar extends Car { override val age = 42 }
그리고, LSP + UAP 때문에,이 작업을 수행 할 수 없게한다 :
trait Car { def age: Int = 7; def age_=(a: Int) = {}} class SedanCar extends Car { override val age = 42 }
당신이 :) 수에 관계없이 사실
-
==============================
2.난 당신이 개념에 문제가있는 것 같아요. 스칼라 참조에서 :
난 당신이 개념에 문제가있는 것 같아요. 스칼라 참조에서 :
변수 선언 var에 X : T는의 선언에 해당 게터 기능 X 다음과 세터 함수 X_ = 드 인터넷 네드 :
def x: T def x_= (y: T ): Unit
당신이 "나이 = 54"에 의해 게터를 무시하려고 그래서. 그러나 지금 당신은 세터에 대한 사용이 없습니다.
당신이 무슨 뜻인지 얻을 바랍니다. 난 당신이 여기 스칼라의 사고 방식으로 생각하지 않기 때문에 사람들이 "마이너스"당신의 질문은 왜 생각합니다.
from https://stackoverflow.com/questions/27623074/why-its-impossible-to-override-var-with-def-in-scala by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 어떻게 요소의 액세스 스파크 RDD 배열에 인덱스를 기반으로 (0) | 2019.11.24 |
---|---|
[SCALA] 스칼라에서 소거를 입력 (0) | 2019.11.24 |
[SCALA] 같은 발견하고 필요한 데이터 유형과 스파크에서 : "오류 형식이 일치하지 않습니다" (0) | 2019.11.24 |
[SCALA] 스칼라 mapValues 게으른인가? (0) | 2019.11.24 |
[SCALA] 비 단락 자바 / 스칼라 논리 (부울) 연산자를위한이 좋은 용도는? (0) | 2019.11.24 |