Program Club

Scala에서 여러 생성자가있는 Java 클래스를 어떻게 하위 클래스로 만들 수 있습니까?

proclub 2020. 12. 30. 08:21
반응형

Scala에서 여러 생성자가있는 Java 클래스를 어떻게 하위 클래스로 만들 수 있습니까?


여러 생성자가있는 Java 클래스가 있다고 가정합니다.

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

Scala에서 어떻게 확장하고 Base의 세 생성자 모두에 대한 액세스를 제공 할 수 있습니까? Scala에서 서브 클래스는 수퍼 클래스의 생성자 중 하나만 호출 할 수 있습니다. 이 규칙을 어떻게 해결할 수 있습니까?

Java 클래스가 변경할 수없는 레거시 코드라고 가정합니다.


특성이 클래스를 확장 할 수 있다는 사실을 잊기 쉽습니다. 트레이 트를 사용하는 경우 다음과 같이 호출 할 생성자 결정을 연기 할 수 있습니다.

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
}

특성 자체에는 생성자 매개 변수가 없을 수 있지만 대신 추상 멤버를 사용하여이 문제를 해결할 수 있습니다.


편집 - 이것은 내가 여기에 복제되었다고 생각한 스칼라 메일 링리스트의 질문에서 나온 것입니다. 내 대답은 세 가지 다른 생성자 (예 : Java 디자인 복제)를 제공하고 클래스를 확장하지 않는 것과 관련이 있습니다.

각 생성자가 궁극적으로 객체 상태 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
}

가장 일반적인 것 (이 경우 String)을 선택하고 다른 기준을 충족하는 경우 내부 변환을 직접 수행합니다.

나는 이것이 최선의 해결책이 아니라는 것을 인정하지만 뭔가 잘못되었다고 생각합니다. :-(


이것은 아마도 다소 작동하지만 Java 클래스에 생성자가 너무 많은 경우 너무 많은 노력이 될 수있는 어리석은 대답이지만 다음과 같습니다.

다양한 다른 생성자가 할 수있는 모든 입력을 취하고 입력의 유무에 따라 수퍼 클래스의 적절한 생성자를 호출하는 생성자를 구현하는 Java로 서브 클래스를 작성합니다 ( "null"또는 일종의 센티넬 값 사용). 그런 다음 Scala에서 해당 Java 클래스를 하위 클래스로 만들고 sentinel 값을 기본 매개 변수로 할당합니다.

참조 URL : https://stackoverflow.com/questions/3299776/in-scala-how-can-i-subclass-a-java-class-with-multiple-constructors

반응형