Pergunta

I have what seems like a straightforward enough issue, but I just have no idea why it's working the way it is.

I have a class Shape which has a subclass of Square.

When I call Square and call its designated initialiser, in self = [super init] it calls the super class. However when the superclass calls its designated initialiser, named the same as one of the subclasses, it calls the subclass.

What I end up with is an infinite loop of the subclass calling init on the superclass and that calling the subclasses initialiser.

How can I solve this issue? Should I make sure the names of my initialisers are different enough so this can't happen?

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
Foi útil?

Solução

The thing to do here is to reimplement -[Square initWithWidth:andPosition:] like:

- (id)initWithWidth:(float)width andPosition:(CGPoint)position
{
    self = [super initWithWidth:width andHeight:width andPosition:position];
    return self;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top