从超类发送消息到子类

时间:2014-08-31 07:29:42

标签: objective-c

我有一个基类让我们说BaseClass做一些逻辑并处理手势。我有另一个类FooBarClass,它提供了视图,也是BaseClass, (FooBar : Base)的子类。

我知道我可以通过super methodName调用超类中的方法。我现在陷入困境,所有观点都是这样设计的,现在我需要将消息从FooBar传递到Base

这可能吗?如果是这样的话?我应该使用NSNotifications还是有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

如果要创建子类的实例,在您的情况下为FooBarClass,则无需担心从超类传递到子类的消息。通过继承,可以从BaseClass访问FooBarClass的头文件(.h)中公开的任何属性,方法。如果BaseClass中已覆盖属于FooBarClass的方法,则必须明确使用super,否则您可以直接调用self。但是,如果属于BaseClass的属性已在FooBarClass中被覆盖,则该变量将保留最后存储的值。这就是为什么通常,属性永远不会被覆盖的原因,因为它会让人感到困惑。

最后,不需要NSNotification

Ex:BaseClass.h

@interface BaseClass : UIView

- (void)runTest;
- (void)sayHi;
- (void)sayHi2;
@property (assign, nonatomic) NSInteger commonVar;
@end

BaseClass.m

- (void)runTest
{
    self.commonVar = 100;
}
- (void)sayHi
{
    NSLog(@"Hi from super");
    NSLog(@"In super variable = %d", self.commonVar);  
}
- (void)sayHi2
{
   NSLog(@"Hi from super2");
}

FooBarClass.h

@interface FooBaseClass : BaseClass

@property (assign, nonatomic) NSInteger commonVar;
@end

FooBarClass.m

 - (void)runTest
{
    self.commonVar = 1;
    [super runTest];  // Now, commonVar variable will be holding 100 throughout.
    [super sayHi];
    [super sayHi2];  // Same as next line because there is no sayHi2 overridden.
    [self sayHi2];
    [self sayHi];
}

- (void)sayHi
{
    NSLog(@"Hi from derived");
    NSLog(@"In derived variable = %d", self.commonVar);  
}

希望这个答案可以帮到你。