2010-12-04 4 views
0

오늘 오후 MacRuby를 발견했습니다. 그 사람은 항상 멋지다! 그러나 일부 MacRuby-fu로 오래된 프로젝트를 확장하려고 시도하면서 몇 가지 어려움을 겪었습니다.MacRuby 사용자 정의 초기화 프로그램

@implementation Foo 
- (id) init { 
    if (self = [super init]) { 
     //Do nothing, don't have enough data... 
    } 
    return self; 
} 

- (id) initWithName:(NSString*)n andLocation:(NSString*)loc andSomethingElse:(Bar*)b { 
    if (self = [super init]) { 
     //Set a LOT of internal state... 
    } 
    return self; 
} 
@end 

그래서, 루비 파일에, 우리가 전화 할게 Mung.rb 다음과 같습니다 :

그래서 나는 다음과 같다 목표 - C의 슈퍼 클래스가 : 여기 거래입니다

나는 녹두의 인스턴스를 갈 때
class Mung < Foo 
    def initWithSomethingElse(else, andEvenMore:more) 
     super.initWithName("Moop", andLocation:else, andSomethingElse:more.addVal(42)) 
     self 
    end 
end 

은 (myObj로 = Mung.alloc.initWithSomethingElse ("우우", andEvenMore : "미국"), 말해 런타임 폭발라는 녹두의 슈퍼에 정의 된 방법이 없다 'initWithSomethingElse' 이것은 사실이지만, 루비 파일에 커스텀 초기화 프로그램을 정의 할 수 없다는 것을 의미합니다. 현재 작업중 인 라운드는 해시를 취하는 균등 한 이니셜 라이저를 제공 한 다음 필요에 따라 개별 하위 클래스가 해시를 구문 분석하는 것입니다. 나는이 접근 방식이 맘에 들지 않으며 A. 다음과 같은 이유를 설명합니다. A. 'initWithSomethingElse'가 super에서 호출 된 이유와 B. 직접 해결 방법을 적용 할 수없는 경우 대체 해결 방법입니다. 고마워요!

답변

1

MacRuby의 메소드와 다른 메소드의 수퍼 버전을 호출 할 수 없습니다. super 키워드는 Ruby 의미론을 존중하며 현재 메소드의 수퍼 버전에만 호출을 보냅니다.

직접 작성한 경우 initWithName : andLocation : andSomethingElse :를 직접 보내고 필요할 경우 클래스에서이 선택기를 다시 정의하고 적절하게 super를 호출 할 수 있습니다.

+0

음, 어리석은 기분입니다. 어제 밤에 잠자리에 드는 후에도이 해결책을 생각했습니다. 확실히 자기 자신을 부르려고 노력 했음에 틀림 없다. .. 도와 줘서 고마워! – Grimless

관련 문제