4

キーワード「va_list」「va_start」「va_arg」「va_end」の使い方を理解しています。そして、私の夕食クラスには、次のようなinitメソッドがあります。

スーパークラス:

- (id) initWithChildren:(NSObject*)firstChild, ... NS_REQUIRES_NIL_TERMINATION{
    if(self = [super init]){
        va_list children;
        va_start(children, firstChild);

        self.children = [[NSMutableArray alloc] initWithObjects:firstChild, nil];
        firstChild.father = self;

        NSObject* child;
        while ((child = va_arg(children, NSObject*)) != nil){
            [_children addObject:child];
        }
        va_end(children);
    }
    return self;
}

それはうまくいきますが、私はそれを継承するのに苦労しています。

サブクラス

- (id) initWithName:(NSString*)name children:(NSObject*)firstChild, ... NS_REQUIRES_NIL_TERMINATION{
    self = [super initWithChildren:"what should I write here?"];
    if (self){
        self.name = name;
        //other subclass work
    }
    return self;
}

何かアイデアはありますか?ありがとうございます。

4

1 に答える 1

2

これを行うには、スーパークラスはva_list、パラメーターとして受け取る指定された初期化子を公開する必要があります。vprintf標準ライブラリでどのように行われるかの例については、を参照してください。

- (id) initWithChildren:(NSObject*)firstChild, ... NS_REQUIRES_NIL_TERMINATION {
    va_list args;
    va_start(args, firstChild);
    id res = [self initWithChildren:firstChild varArg:args];
    va_end (args);
    return res;
}

- (id) initWithChildren:(NSObject*)firstChild, varArg:va_list args {
    // Do the actual initialization here
    ...
}
于 2013-02-07T03:43:21.757 に答える