類的繼承
- 繼承反映的是類之間的相似性
圓形類
@interface Circle : NSObject
{
double x;
double y;
CGColorRef lineColor;
CGColorRef fillColor;
double radius;
}
- (void)moveToX:(double)x Y:(double)y;
- (void)setLineColor:(CGColorRef)lineColor;
- (void)setFillColor:(CGColorRef)fillColor;
- (void)setRadius:(double)r;
@end
矩形類
@interface Rectangle : NSObject
{
double x;
double y;
CGColorRef lineColor;
CGColorRef fillColor;
double width;
double height;
}
- (void)moveToX:(double)x andY:(double)y;
- (void)setLineColor:(CGColorRef)lineColor;
- (void)setFillColor:(CGColorRef)fillColor;
- (void)setWidth:(double)w;
- (void)setHeight:(double)h;
@end
對比圓形類跟矩形類,發(fā)現(xiàn)有很多重復(fù)的部分种呐。
** 繼承反映的是類之間的相似性 **
形狀類
@interface Shape : NSObject
{
double x;
double y;
CGColorRef lineColor;
CGColorRef fillColor;
}
- (void)moveToX:(double)x andY:(double)y;
- (void)setLineColor:(CGColorRef)lineColor;
- (void)setFillColor:(CGColorRef)fillColor;
@end
- 什么是繼承宰翅?
如果類B繼承了類A,那么B會包含A的所有屬性和方法陕贮。
如果圓形類和矩形類都繼承了形狀類堕油,那么很多屬性跟方法就不用再寫一遍。
- 使用繼承來寫Circle類
@interface Circle : Shape
{
double radius;
}
- (void)setRadius:(double)r;
@end
Circle類繼承了Shape類肮之,代碼精簡了很多掉缺,重復(fù)的部分都不用寫了。
- 使用繼承來寫Rectangle類
@interface Rectangle : Shape
{
double width;
double height;
}
- (void)setWidth:(double)w;
- (void)setHeight:(double)h;
@end
使用繼承戈擒,只要寫自己類特有的屬性跟方法即可眶明。
基類/父類 ??派生類/子類
NSObject類
ObjC的類都繼承NSObject類完整實(shí)現(xiàn)一個例子
父類Shape類
#import <Foundation/Foundation.h>
@interface Shape : NSObject {
double xCoord;
double yCoord;
CGColorRef lineColor;
CGColorRef fillColor;
}
- (void)moveToX:(double)x andY:(double)y;
- (void)setLineColor:(CGColor)lineColor;
- (void)setFillColor:(CGColor)fillColor;
@end
@implementation Shape
-(id)init {
self = [super init];
if (self) {
xCoord = 0.0;
yCoord = 0.0;
lineColor = NULL;
fillColor = NULL;
}
return self;
}
- (void)moveToX:(double)x andY:(double)y {
xCoord = x;
yCoord = y;
}
- (void)setLineColor:(CGColor)color {
lineColor = color;
}
- (void)setFillColor:(CGColor)color {
fillColor = color;
}
@end
子類Circle類
@interface Circle : Shape {
double radius;
}
- (void)setRadius:(double)r;
@end
@implementation Circle {
- (id)init {
self = [super init];//注意,因?yàn)槔^承自Shape類筐高,所以這里的super指的是Shape類
if (self) {
radius = 0.0;//只用初始化Circle類特有的半徑變量
}
return self;
}
- (void)setRadius:(double)r {
radius = r;
}
@end
子類Rectangle類
@interface Rectangle : Shape {
double width;
double height;
}
- (void)setWidth:(double)w;
- (void)setHeight:(double)h;
@end
@implementation Rectangle {
- (id) init {
self = [super init];//實(shí)現(xiàn)部分不要忘了第一步是初始化搜囱!
if (self) {
width = 0.0;
height = 0.0;
}
return self;
}
- (void)setWidth:(double)w {
width = w;
}
- (void)setHeight:(double)h {
height = h;
}
@end