복붙노트

[SCALA] 객체를 확장 할 수있는 방법이 있습니까?

SCALA

객체를 확장 할 수있는 방법이 있습니까?

스칼라, 우리는 객체를 확장 할 수 없습니다 :

object X 
object Y extends X

찾을 수 없습니다 : 오류 오류가 제공 X를 입력

내 경우에는 누군가가 객체의 일부 기능을 정의하고 나는 (기본적으로 다른 방법을 추가)를 확장해야합니다. 이 객체를 확장하는 가장 쉬운 방법이 있을까요?

해결법

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

    1.너무 자주 정답은 실제 비즈니스 요구 사항에 따라 달라. 그것은 더 이상 싱글을하지 않을 것이기 때문에 객체에서 확장하는 것은 어떤 의미에서 그 객체의 목적을 무시하는 것입니다.

    너무 자주 정답은 실제 비즈니스 요구 사항에 따라 달라. 그것은 더 이상 싱글을하지 않을 것이기 때문에 객체에서 확장하는 것은 어떤 의미에서 그 객체의 목적을 무시하는 것입니다.

    어떤 해결책이 될 수있는 것은 추상적 인 특성으로 동작을 추출하는 것입니다. 그래서 같이 그 특성을 확장 개체를 만들 :

    trait T{
        // some behavior goes here
    }
    
    object X extends T
    
    object Y extends T {
        // additional stuff here
    }
    
  2. ==============================

    2.다른 개체에서 사용하는 방법과 값을 원하는 경우에 당신은 가져 오기를 사용할 수 있습니다.

    다른 개체에서 사용하는 방법과 값을 원하는 경우에 당신은 가져 오기를 사용할 수 있습니다.

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

    3.그게 두 가지를 만들 것 때문에 실제로 객체를 확장 할 수 있으며, 정의에 의해 객체는 한 번만 존재 (편집 : 객체 정의가 클래스 나 메소드에있을 수 있기 때문에 글쎄, 그건, 사실이 아니다).

    그게 두 가지를 만들 것 때문에 실제로 객체를 확장 할 수 있으며, 정의에 의해 객체는 한 번만 존재 (편집 : 객체 정의가 클래스 나 메소드에있을 수 있기 때문에 글쎄, 그건, 사실이 아니다).

    당신의 목적을 위해,이 시도 :

    object X {
    }
    
    object Y {
        def a = 5
    }
    
    implicit def xToY(x: X.type) = Y
    
    println(X.a)
    

    실제로 확장하지 않지만, 원래 정의 된 것보다 당신이 그것에 새로운 방법을 호출 할 수 없습니다.

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

    4.두 개체 사이의 코드 공유 할 수있는 유일한 방법은 하나 이상의 공통의 슈퍼 클래스 / 특성을 가진 것입니다.

    두 개체 사이의 코드 공유 할 수있는 유일한 방법은 하나 이상의 공통의 슈퍼 클래스 / 특성을 가진 것입니다.

  5. ==============================

    5.당신은 클래스 + 동반자 객체로 부모를 변환 한 다음 아이 예컨대 클래스를 확장 할 수 있습니다

    당신은 클래스 + 동반자 객체로 부모를 변환 한 다음 아이 예컨대 클래스를 확장 할 수 있습니다

    Parent.scala에서

    class Parent {}
    
    object Parent extends Parent {}
    

    그리고 Child.scala에서

    object Child extends Parent {}
    

    예, 그것은 더 솔루션보다 해킹.

  6. ==============================

    6.도티 (스칼라 3의 기초)와 함께, 당신은 다른 방법으로 개체의 선택된 구성원에 대한 별칭을 정의 할 수 있도록 수출 조항을 통해 (대신 상속) 구성을 사용할 수 있습니다 :

    도티 (스칼라 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
    

    당신은 또한 당신이 내보낼 회원 제한 할 수 있습니다 :

    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
    
  7. from https://stackoverflow.com/questions/7625040/is-there-any-way-to-extend-an-object by cc-by-sa and MIT license