深入淺出Objective-C筆記(五)

類(lèi)的繼承


  • 繼承反映的是類(lèi)之間的相似性

圓形類(lèi)

@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 

矩形類(lèi)

@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

對(duì)比圓形類(lèi)跟矩形類(lèi),發(fā)現(xiàn)有很多重復(fù)的部分。

** 繼承反映的是類(lèi)之間的相似性 **

形狀類(lèi)

@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 
  • 什么是繼承?

如果類(lèi)B繼承了類(lèi)A,那么B會(huì)包含A的所有屬性和方法。

如果圓形類(lèi)和矩形類(lèi)都繼承了形狀類(lèi),那么很多屬性跟方法就不用再寫(xiě)一遍。

  • 使用繼承來(lái)寫(xiě)Circle類(lèi)
  @interface Circle : Shape
  {
      double radius;
  }
  - (void)setRadius:(double)r;
  @end

  Circle類(lèi)繼承了Shape類(lèi),代碼精簡(jiǎn)了很多,重復(fù)的部分都不用寫(xiě)了。
  • 使用繼承來(lái)寫(xiě)Rectangle類(lèi)
  @interface Rectangle : Shape
  {
    double width;
    double height;
  }
  - (void)setWidth:(double)w;
  - (void)setHeight:(double)h;
  @end    
  
  使用繼承,只要寫(xiě)自己類(lèi)特有的屬性跟方法即可。
  • 基類(lèi)/父類(lèi) ??派生類(lèi)/子類(lèi)

  • NSObject類(lèi)
    ObjC的類(lèi)都繼承NSObject類(lèi)

  • 完整實(shí)現(xiàn)一個(gè)例子

父類(lèi)Shape類(lèi)
#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 

子類(lèi)Circle類(lèi)

@interface Circle : Shape {
    double radius;
}

- (void)setRadius:(double)r;
@end

@implementation Circle {
- (id)init {
    self = [super init];//注意,因?yàn)槔^承自Shape類(lèi),所以這里的super指的是Shape類(lèi)
    if (self) {
        radius = 0.0;//只用初始化Circle類(lèi)特有的半徑變量
    }
    return self;
}

- (void)setRadius:(double)r {
      radius = r;
}
@end 

子類(lèi)Rectangle類(lèi)

@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 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容