0

我有一个看起来很简单的问题,但我只是不知道为什么它会这样工作。

我有一个 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
4

1 回答 1

1

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

- (id)initWithWidth:(float)width andPosition:(CGPoint)position
{
    self = [super initWithWidth:width andHeight:width andPosition:position];
    return self;
}
于 2013-09-19T00:16:04.803 回答