복붙노트

[SCALA] 왜 스칼라에서 def``와`var`을 무시하는 것은 불가능?

SCALA

왜 스칼라에서 def``와`var`을 무시하는 것은 불가능?

var에가 서브 클래스와 반대의 반대에 발을 무시할 수없는 이유를 이해하는 동안, 나는 스칼라는 데프 하위 클래스에서 상위 클래스의 VAR을 무시할 수없는 이유를 이해 할 수없는입니다

class Car {
  var age = 32
}

class SedanCar extends Car {
  override def age = 54
}

허용하지 왜 var에 변경 가능한 같이 데프 그것을 무시하는? 사람이를 이해하는데 도움이 저를 기쁘게 할 수 있습니까?

해결법

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

    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. ==============================

    2.난 당신이 개념에 문제가있는 것 같아요. 스칼라 참조에서 :

    난 당신이 개념에 문제가있는 것 같아요. 스칼라 참조에서 :

    변수 선언 var에 X : T는의 선언에 해당 게터 기능 X 다음과 세터 함수 X_ = 드 인터넷 네드 :

    def x: T
    def x_= (y: T ): Unit
    

    당신이 "나이 = 54"에 의해 게터를 무시하려고 그래서. 그러나 지금 당신은 세터에 대한 사용이 없습니다.

    당신이 무슨 뜻인지 얻을 바랍니다. 난 당신이 여기 스칼라의 사고 방식으로 생각하지 않기 때문에 사람들이 "마이너스"당신의 질문은 왜 생각합니다.

  3. from https://stackoverflow.com/questions/27623074/why-its-impossible-to-override-var-with-def-in-scala by cc-by-sa and MIT license