Objective-C中的继承

1. 父类自身也可以有父类,没有父类的类位于类层次的最顶层,称为根类(父类也可以被称为超类)。
2. 继承中,父类的非私有实例变量和方法都会成为新类定义的一部分。子类可以直接访问这些方法和实例变量,就像在类定义中直接定义了这些子类一样。注意:在子类使用实例变量,必须在接口部分声明,而不是在实现部分声明。在实现部分声明和合成(synthesize)的实例变量时私有的,子类并不能直接访问,需要明确定义或合成取值方法,才能访问实例变量的值。
3. 类的每个实例都拥有自己的实例变量,即使这些变量是继承来的。
4. @class指令:使用@class指令可以提高效率,因为编译器不需要引入和处理整个 Class.h文件(Class是用户自己定义的一个类),只需要知道Class是一个类名。如果需要引用Class类的方法(在实现部分中),@class指令是不够的,因为编译器需要更多的消息。它需要清楚方法有多少参数、它们是什么类型、方法的返回类型是什么。

5. 

#import <Foundation/Foundation.h>
#import "XYPoint.h"

@interface XYPoint : NSObject
@property int x, y;

-(void) setX: (int) xVal andY: (int) yVal;
@end

-(void) setOrigin:(XYPoint *)pt{
    origin = pt;
}
#import <Foundation/Foundation.h>
#import "Rectangle.h"
#import "XYPoint.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Rectangle *myRect = [[Rectangle alloc] init];
        XYPoint *myPoint = [[XYPoint alloc] init];
        
        [myPoint setX:100 andY:200];
        
        NSLog(@"Origin at (%i, %i)", myRect.oringin.x, myRect.oringin.y);
        
        [myPoint setX:50 andY:50];
        NSLog(@"Origin at (%i, %i)", myRect.oringin.x, myRect.oringin.y);
        

    }
    return 0;
}

当使用表达式myRect.origin = myPoint 调用setOrigin:方法时,myPoint

的值作为参数传递给该方法。这个值指向存储XYPoint对象的内存,所以

在改变myPoint的值时,myRect.origin.x/y也会随之改变,避免这个问题

的方法就是修改setOrigin:方法,这样就能够创建自己的点,并将origin

设置为这个点。

6. 抽象类:创建类只是为了更容易创建子类,这些类名为抽象类(如

NSNumber类等)。每个具体的属于如NSNumber类的抽象超类的子

类,总称为簇。

猜你喜欢

转载自blog.csdn.net/qq_42347755/article/details/80791932