调用超类指定的初始化程序会调用子类

时间:2013-09-19 00:04:32

标签: ios objective-c designated-initializer

我有一个看似简单的问题,但我不知道为什么它的工作方式如此。

我有一个类Shape,其子类为Square。

当我调用Square并调用其指定的初始化程序时,在self = [super init]中它调用超类。但是,当超类调用其指定的初始化程序(名称与其中一个子类相同)时,它会调用子类。

我最终得到的是子类的无限循环,在超类上调用init并调用子类初始化。

我该如何解决这个问题?我应该确定我的初始化者的名字是否足够不同,以免发生这种情况?

Shape.h

#import <Foundation/Foundation.h>

@interface Shape : NSObject

@property (nonatomic) CGPoint position;
@property (nonatomic) float width;
@property (nonatomic) float height;
@property (nonatomic, readonly) float area;

- (id)initWithWidth:(float)width andHeight:(float)height andPosition:(CGPoint)position;
- (id)initWithWidth:(float)width andHeight:(float)height;
- (id)initWithWidth:(float)width;
- (id)init;

- (NSString *)drawShape;

@end

-

Shape.m

#import "Shape.h"

@implementation Shape

- (id)initWithWidth:(float)width andHeight:(float)height andPosition:(CGPoint)position
{
    self = [super init];

    if (self) {
        self.width = width;
        self.height = height;
        self.position = position;
    }

    return self;
}

- (id)initWithWidth:(float)width andHeight:(float)height
{
    return [self initWithWidth:width andHeight:height andPosition:CGPointMake(100, 100)];
}

- (id)initWithWidth:(float)width
{
    return [self initWithWidth:width andHeight:1.0f andPosition:CGPointMake(100, 100)];
}

- (id)init
{
    CGPoint defaultPoint = CGPointMake(100, 100);

    return [self initWithWidth:1.0 andHeight:1.0 andPosition:defaultPoint];
}

- (NSString *)drawShape
{
    NSString *outputShape = [NSString stringWithFormat:@"Drawing shape - (%.2f,%.2f), width - %f, height - %f", self.position.x, self.position.y, self.width, self.height];

    NSLog(@"%@", outputShape);

    return outputShape;
}

@end

-

Square.h

#import <Foundation/Foundation.h>
#import "Shape.h"

@interface Square : Shape

- (id)initWithWidth:(float)width andPosition:(CGPoint)position;
- (id)initWithWidth:(float)width andHeight:(float)height andPosition:(CGPoint)position;
- (id)initWithWidth:(float)width andHeight:(float)height;
- (id)initWithWidth:(float)width;

@end

-

Square.m

#import "Square.h"

@implementation Square

- (id) initWithWidth:(float)width andPosition:(CGPoint)position
{
    self = [super init];

    if (self) {
        self.width = width;
        self.height = width;
        self.position = position;
    }

    return self;
}

// Returning the width as the width and height as you can't make a square with different sides
- (id)initWithWidth:(float)width andHeight:(float)height andPosition:(CGPoint)position
{
    return [self initWithWidth:width andPosition:position];
}

- (id)initWithWidth:(float)width andHeight:(float)height
{
    return [self initWithWidth:width andPosition:CGPointMake(100, 100)];
}

- (id)initWithWidth:(float)width
{
    return [self initWithWidth:width andPosition:CGPointMake(100, 100)];
}

- (NSString *)drawShape
{
    NSString *outputShape = [NSString stringWithFormat:@"Drawing shape - (%.2f,%.2f), width - %.2f, height - %.2f", self.position.x, self.position.y, self.width, self.height];

    NSLog(@"%@", outputShape);

    return outputShape;
}

@end

1 个答案:

答案 0 :(得分:1)

这里要做的是重新实现-[Square initWithWidth:andPosition:],如:

- (id)initWithWidth:(float)width andPosition:(CGPoint)position
{
    self = [super initWithWidth:width andHeight:width andPosition:position];
    return self;
}