如果我覆盖派生类中的方法,我应该在派生类的标题中再次声明它吗?

时间:2014-02-20 18:02:29

标签: objective-c class inheritance override

我正在学习Objective-C。在本书的练习中,我将创建一个 Person 类和一个派生自 Person Employee 类。

Person.h

@interface Person : NSObject

@property (nonatomic) float heightInMeters;
@property (nonatomic) int weightInKilos;

- (float)bodyMassIndex;

@end

Person.m

@implementation Person

- (float)bodyMassIndex
{
    return self.weightInKilos / (self.heightInMeters * self.heightInMeters);
}

@end

Employee.h

@interface Employee : Person

@property (nonatomic) int employeeID;

@end

Employee.m

@implementation Employee

- (float)bodyMassIndex
{
    return [super bodyMassIndex] * 0.9;
}

@end

我的书说,因为 Employee 继承自 Person ,所以每个人都已经知道 Employee 有一个名为 bodyMassIndex ,所以不需要再次做广告(在Employee.h中)。无论有没有额外的声明,我都试过了,两种方式都有效。

我的问题是,你是否应该再次宣布它?哪种方式最时尚?

2 个答案:

答案 0 :(得分:1)

通常,请避免重新声明。如果你在Apple的头文件中闲逛,你会发现他们正在做的事情。

很少有例外情况,重新声明可以让事情更清晰,但这种判断会带来经验。祝你好运!

答案 1 :(得分:0)

不要重新声明它,因为它是额外的,不必要的冗余代码。此外,如果由于某种原因你必须改变方法签名,那么你需要更改它的另一个地方,还有一个地方让你忘记改变它,所以避免这种不必要的重复是个好主意。在大多数情况下,@synthesize不再需要它是相同的 - 不要再这样做了,因为当你改变其他东西时,你可能忘记更新不必要的额外代码。

话虽如此,克莱布里奇斯在他的回答中提出了一个很好的观点,即在极少数情况下这是有道理的,但通常你会从经验中学到这一点,如果你不确定,这可能意味着将其抛弃。我可能只会这样做,如果它是一个非常重要且与我的课程相关的方法,最初被宣布不是在直接的超类中,而是在链的更远的地方,我想确保人们知道重要。