2013-06-27 5 views
2

취미 프로젝트로, 나는 내 자신의 목표 시스템을 구축하려고 노력하고 있습니다. 모든 클래스의 기본 상속을 내 기본 클래스 Entity으로 변경하는 방법이 있는지 궁금 해서요. 따라서 새 클래스를 만들 때마다 명시 적으로 말할 필요가 없습니다. class Thing < Entity; 이상적으로는 class Thing이라고 말하고 기본 수퍼 클래스를 내 Entity 클래스로 지정할 수 있습니다.Ruby에서 클래스의 기본 상속을 변경할 수 있습니까?

VALUE 
rb_define_class_id(ID id, VALUE super) 
{ 
    VALUE klass; 

    if (!super) super = rb_cObject; // <-- where the default is set 
    klass = rb_class_new(super); 
    // ... 

을하지만 그 거대한 번거 로움과 패치 및 사용자 정의 루비를 실행해야합니다 아마 하드 -이다 개는 물건을 많이 가지고 :

+0

이 작업을 수행 할 때 어떤 점도 나타나지 않습니다. 'Entity'에 어떤 기능을 추가 할 것인가는'Object' 또는'include'''''''''''''에 구현 될 수 있습니다. – sawa

답변

6

물론 당신은 루비를 relevant part of the Ruby source를 수정하고 재 컴파일하여이 작업을 수행 할 수 기본 설정은 Object입니다.

그리고 무엇보다 중요한 점은 무엇입니까? Object을 기본 수퍼 클래스로 바꾸면 모든 클래스 (Ruby 코어의 클래스 포함)가이 새로운 기본 수퍼 클래스에서 상속됩니다. Object 자체를으로 변경하여 사용자 정의 루비 을 사용하지 않고도 다른 이름을 사용하지 않고 동일한 효과를 얻을 수 있습니다. 그것은 수업을 재개 할 수 있다는 것의 아름다움입니다! 예를 들어 당신이되고 싶다면

class Object 
    def foo 
    'bar!' 
    end 
end 

class A; end 

A.new.foo #=> 'bar!' 

종류 당신은 단지 Entity 모듈 대신 클래스의 모든 관련 방법을 넣을 수 있으며 Object에 다음 include을.

+1

+1, 개체를 monkeypatch하는 방법을 보여 주거나 모듈을 포함시킬 수 있습니다. (내가 입력 할 때이 편집을 추가 할 수도 있습니다.) – Phrogz

+0

@Phrogz 좋은 점,':)'이 추가되었습니다. –

+0

+1, 의견을 보내 주셔서 감사합니다! 필자는 Ruby를 최근부터 사용하기 시작했으며 구문에 익숙해지기 시작했지만 필자는 근본적으로 오픈 소스 프로그래밍 언어라는 개념에 완전히 익숙하지 않습니다. 그리고 오랫동안 사용하지 않았기 때문에 동적으로 수정하는 클래스의 힘을 실제로 경험할 수 없었습니다. 내가 너의 마지막 제안을 할 수 있다고 생각한다. – DesAdams

0

아니요, 불행히도 루비에서는 불가능합니다. 루비는 메타 객체 프로토콜을 가지고 있지 않다. CLOS를 사용하면 객체 모델의 핵심 의미를 조작 할 수 있습니다. 그래도 좋을거야!

관련 문제