복붙노트

[SCALA] 스칼라에서 어떻게 여러 생성자와 자바 클래스를 서브 클래 싱 할 수 있습니까?

SCALA

스칼라에서 어떻게 여러 생성자와 자바 클래스를 서브 클래 싱 할 수 있습니까?

나는 여러 생성자와 자바 클래스가 있다고 가정 :

class Base {
    Base(int arg1) {...};
    Base(String arg2) {...};
    Base(double arg3) {...};
}

어떻게 스칼라를 확장 할 수 있습니다 여전히 자료의 생성자의 세 가지에 대한 액세스를 제공? 스칼라에서는 서브 클래스는 그것의 슈퍼 클래스의 생성자 중 하나를 호출 할 수 있습니다. 어떻게이 규칙을 해결할 수 있습니까?

자바 클래스를 가정 내가 바꿀 수없는 레거시 코드입니다.

해결법

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

    1.그것은 특성이 클래스를 확장 할 수 있다는 것을 잊지 쉽습니다. 당신이 특성을 사용하는 경우에는 다음과 같이 호출 할 수있는 생성자의 결정을 연기 할 수 있습니다 :

    그것은 특성이 클래스를 확장 할 수 있다는 것을 잊지 쉽습니다. 당신이 특성을 사용하는 경우에는 다음과 같이 호출 할 수있는 생성자의 결정을 연기 할 수 있습니다 :

    trait Extended extends Base {
      ...
    }
    
    object Extended {
      def apply(arg1: Int) = new Base(arg1) with Extended
      def apply(arg2: String) = new Base(arg2) with Extended
      def apply(arg3: Double) = new Base(arg3) with Extended
    }
    

    형질 자체는 생성자의 매개 변수가되지 않을 수도 있습니다,하지만 당신은 대신 추상적 인 멤버를 사용하여 해당 해결할 수 있습니다.

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

    2.편집 -이 내가 여기에 중복 된 생각 스칼라 메일 링리스트에 질문에서입니다. 내 대답 (즉 자바 디자인 복제) 세 가지 생성자를 제공하고, 클래스를 확장하지 관한

    편집 -이 내가 여기에 중복 된 생각 스칼라 메일 링리스트에 질문에서입니다. 내 대답 (즉 자바 디자인 복제) 세 가지 생성자를 제공하고, 클래스를 확장하지 관한

    당신의 생성자의 각 궁극적으로 객체의 상태 (S)를 만드는 것이 가정하면,이 상태를 만들 수있는 "정적"방법과 동반자 객체를 생성

    object Base {
      private def stateFrom(d : Double) : S = error("TODO")
      private def stateFrom(s : Str) : S = error("TODO")
      private def stateFrom(i : Int) : S = error("TODO")
    } 
    

    이어서 전용 생성자 기본 생성자되는 연기 및 상태 (공개) 오버 스트 복용을 만들

    import Base._
    class Base private(s : S) { //private constructor takes the state
      def this(d : Double) = this(stateFrom(d)) 
      def this(str : String) = this(stateFrom(str))
      def this(i : Int) = this(stateFrom(i))
      //etc
    }
    
  3. ==============================

    3.그것은 다른 기준을 충족하는 경우 나 자신을 (이 경우, 문자열에서) 가장 일반적인 하나를 선택하고 내부 변환을 할 것입니다.

    그것은 다른 기준을 충족하는 경우 나 자신을 (이 경우, 문자열에서) 가장 일반적인 하나를 선택하고 내부 변환을 할 것입니다.

    나는 이것이 최선의 해결책이 아니다 인정하고 뭔가 그것에 대해 잘못된 인상을 받았는데 있지만. :-(

  4. ==============================

    4.이것은 아마도 다소 일하는 것이 아니라 자바 클래스가 너무 많은 생성자가있는 경우 너무 많은 노력이 될 수도 있지만, 바보 같은 대답입니다 :

    이것은 아마도 다소 일하는 것이 아니라 자바 클래스가 너무 많은 생성자가있는 경우 너무 많은 노력이 될 수도 있지만, 바보 같은 대답입니다 :

    자바의 서브 클래스를 작성하는 것이 구현하는 다양한 생성자가하는 모든 입력을 받아 ( "널 (null)"또는 감시 값의 어떤 종류의 사용을 통해) 입력의 유무에 따라 슈퍼 클래스의 적절한 생성자를 호출하는 생성자, 다음 스칼라에서 그 자바 클래스를 서브 클래스 및 기본 매개 변수로 감시 값을 지정합니다.

  5. from https://stackoverflow.com/questions/3299776/in-scala-how-can-i-subclass-a-java-class-with-multiple-constructors by cc-by-sa and MIT license