如何知道在NS子类中使用父方法何时安全?

时间:2010-09-02 04:10:43

标签: objective-c inheritance subclass

作为一个例子,当我使用NSMutableDictionary时,我知道它继承了NSDictionary的所有方法,但是如果我想使用NSDictionary方法(如这样),我怎么知道/相信它已经覆盖了那些方法的行为如+dictionaryWithObjectsAndKeys)创建我的可变字典实例?

更一般地说,框架是否有责任确保子类不会盲目地继承可能会破坏子类实例的方法(如果使用的话)?或者编码人员有责任知道不使用它们吗?如果Square继承自Rectangle,并且通过继承我可以调用

Square *newSquare = [[Square alloc] init];
[newSquare setWidth:3 andHeight:6]; //instead of -(void)setSide:(int)side

我已经“破坏”了正方形,其他依赖于宽度等于高度的方法现在不起作用。游戏的规则是什么?

2 个答案:

答案 0 :(得分:0)

规则只会暴露你允许覆盖它的意思,在你的界面上放置真正公开的东西。必要时明确说明在某个时候覆盖特定方法调用[super methodName]。

在您的示例中,您将覆盖方法- (void)setWidth:(int)width andHeight:(int)height,并且您希望在width != height时抛出错误。或者您也可以抛出错误并强制用户仅使用- (void)setSide:(int)side

例如你可以这样做:

// If you want to test and accept cases when width == height
- (void)setWidth:(int)width andHeight:(int)height {
    NSAssert(width == height, NSLocalizedString(@"This is a Square. Width has to be height.", nil));

    [super setWidth:width andHeight:height];

    // Or

    [self setSide:width];
}

// Or if you want to completely prohibit the usage of the method
- (void)setWidth:(int)width andHeight:(int)height {
    NSAssert(NO, NSLocalizedString(@"This is a Square! Please use - (void)setSide:(int)side method.", nil));
}

如果您想在编译时抛出一些错误和警告,可以使用方法声明,NSObjCRuntime.h上定义的一些宏。

答案 1 :(得分:0)

我不相信父方便方法来调用你的继承init方法。例如,该字典方法可以定义为:

+ (id)dictionaryWithObjectsAndKeys:...
{
    return [[[NSDictionary alloc] initWithObjectsAndKeys:...] autorelease];
}

如果以这种方式定义该方法,那么它甚至不会意识到您的实现。

您必须创建自己的便利方法。你的MyDictionary实现中会有类似的东西:

+ (id)myDictionaryWithObjectsAndKeys:...
{
    return [[[MyDictionary alloc] initWithObjectsAndKeys:...] autorelease];
}

-

也...

你可能应该从Square继承Rectangle。继承是附加的。您可以使用一种尺寸(宽度)描述Square,但对于Rectangle,您有两种尺寸(宽度,高度)。