Delegator 클래스

Delegator 클래스

이 라이브러리는 객체에 메서드 호출을 위임(delegate)하는 세 가지 방법을 제공해요. 가장 쓰기 쉬운 건 SimpleDelegator예요. 생성자에 객체를 넘기면 그 객체가 지원하는 모든 메서드가 위임돼요. 이 객체는 나중에 바꿀 수도 있어요.

한 단계 더 나아가, 최상위 DelegateClass 메서드는 클래스 상속을 통해 위임을 쉽게 설정할 수 있게 해줘요. 이것은 훨씬 더 유연해서 이 라이브러리에서 가장 흔한 쓰임이에요.

마지막으로, 위임 방식에 대한 완전한 제어가 필요하면 추상 클래스 Delegator를 상속받아 필요에 맞게 커스터마이즈할 수 있어요. (이런 제어가 필요하다고 느끼면 표준 라이브러리에 있는 Forwardable도 살펴보세요. 어쩌면 그게 요구에 더 잘 맞을 수도 있어요.)

SimpleDelegator의 구현이 Delegator의 사용을 보여주는 좋은 예시예요:

require 'delegate'

class SimpleDelegator < Delegator
  def __getobj__
    @delegate_sd_obj # return object we are delegating to, required
  end

  def __setobj__(obj)
    @delegate_sd_obj = obj # change delegation object,
                           # a feature we're providing
  end
end

참고

RDoc는 위임된 메서드를 감지하지 못할 거예요.

출처: Ruby 3.3 API

본문

상수

  • KERNEL_RESPOND_TO
  • VERSION

클래스 메서드

  • new(obj) — 메서드 호출을 위임할 obj를 전달해요. obj가 지원하는 모든 메서드가 위임돼요.

인스턴스 메서드

  • !()!__getobj__에 위임해요.
  • !=(obj) — 두 객체가 같은 값으로 여겨지지 않으면 true를 돌려줘요.
  • ==(obj) — 두 객체가 같은 값으로 여겨지면 true를 돌려줘요.
  • __getobj__() — 서브클래스가 반드시 오버라이드해야 하며, 메서드 호출이 위임되는 객체를 돌려줘야 해요.
  • __raise__()raise의 별칭.
  • __setobj__(obj) — 서브클래스가 반드시 오버라이드해야 하며, 위임 객체를 obj로 바꿔야 해요.
  • eql?(obj) — 두 객체가 같은 값으로 여겨지면 true를 돌려줘요.
  • freeze()__getobj__가 돌려주는 객체와 self를 모두 동결해요.
  • marshal_dump()__getobj__가 돌려주는 객체의 직렬화 지원.
  • marshal_load(data) — 직렬화된 객체에서 위임을 다시 초기화해요.
  • method_missing(m, *args, &block) — 위임 대상이 메서드에 응답하면 그 메서드를 위임하고, 커널 메서드면 커널 메서드를 실행하고, 아니면 super로 넘겨요.
  • methods(all=true) — 이 위임 객체가 사용할 수 있는 메서드를, 이 객체와 __getobj__의 메서드들의 합집합으로 돌려줘요.
  • protected_methods(all=true) — 이 객체와 __getobj__의 protected 메서드들의 합집합을 돌려줘요.
  • public_methods(all=true) — 이 객체와 __getobj__의 public 메서드들의 합집합을 돌려줘요.
  • raise()Delegatorraise 메서드 호출을 위임할 객체가 없으면 __raise__를 사용하세요.
  • respond_to_missing?(m, include_private)__getobj__를 통해 호출을 전달해서 이 위임 객체가 제공하는 메서드가 있는지 확인해요.

private 인스턴스 메서드

  • target_respond_to?(target, m, include_private)BasicObject 인스턴스를 처리해요.