개체를 확장하는 방법이 있습니까?
스칼라에서는 확장 할 수 없습니다 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
'Programing' 카테고리의 다른 글
루비 : 문자열을 날짜로 변환 (0) | 2021.01.06 |
---|---|
이미지로드 감지 (0) | 2021.01.06 |
UIView : 불투명 vs. 알파 vs. 불투명 (0) | 2021.01.06 |
"#VALUE!"를 어떻게 인식합니까? (0) | 2021.01.06 |
호스트 이름이 처음으로 변경된 후 rabbitmq-server가 시작되지 않음 (0) | 2021.01.06 |