Programing

개체를 확장하는 방법이 있습니까?

lottogame 2021. 1. 6. 07:40
반응형

개체를 확장하는 방법이 있습니까?


스칼라에서는 확장 할 수 없습니다 object.

object X 
object Y extends X

오류를 준다 error: not found: type X

제 경우에는 누군가가 개체에 일부 기능을 정의했고이를 확장해야합니다 (기본적으로 다른 메서드 추가). 이 개체를 확장하는 가장 쉬운 방법은 무엇입니까?


종종 정답은 실제 비즈니스 요구 사항에 따라 다릅니다. 객체에서 확장하는 것은 더 이상 싱글 톤이 아니기 때문에 어떤 의미에서 그 객체의 목적에 반하는 것입니다.

해결책은 행동을 추상적 인 특성으로 추출하는 것입니다. 다음과 같이 해당 특성을 확장하는 개체를 만듭니다.

trait T{
    // some behavior goes here
}

object X extends T

object Y extends T {
    // additional stuff here
}

다른 개체의 메서드와 값을 사용하려면 가져 오기를 사용할 수 있습니다.

object X{
  def x = 5
}

object Y{
  import X._
  val y = x
}

실제로 객체를 확장 할 수는 없습니다. 두 개를 생성하고 정의에 따른 객체는 한 번만 존재하기 때문입니다 (편집 : 객체 정의가 클래스 또는 메서드에있을 수 있기 때문에 사실이 아닙니다).

목적을 위해 다음을 시도하십시오.

object X {
}

object Y {
    def a = 5
}

implicit def xToY(x: X.type) = Y

println(X.a)

실제로 확장되지는 않지만 원래 정의 된 것보다 새로운 메서드를 호출 할 수 있습니다.


두 객체간에 코드를 공유하는 유일한 방법은 하나 이상의 공통 수퍼 클래스 / 특성을 갖는 것입니다.


부모를 클래스 + 컴패니언 객체로 변환 한 다음 자식이 클래스를 확장하도록 할 수 있습니다.

Parent.scala에서

class Parent {}

object Parent extends Parent {}

그리고 Child.scala에서

object Child extends Parent {}

예, 솔루션 이라기보다 해킹에 가깝습니다.


함께합니다 Dotty(재단 Scala 3), 당신은 다른 방법을 통해 (대신 상속) 구성을 사용할 수 있습니다 수출 조항 객체의 선택된 구성원에 대한 별칭을 정의 할 수 있습니다 :

object X { def f = 5 }

object Y {
  export X._
  def g = 42
  def h = f * g
}

Y.f // 5
Y.g // 42
Y.h // 210

Note that you can also restrict which members you want to export:

object X { def f = 5; def g = 6 }
object Y { export X.f }
Y.f // 5
Y.g
^^^
value g is not a member of Y

ReferenceURL : https://stackoverflow.com/questions/7625040/is-there-any-way-to-extend-an-object

반응형