深入浅出Objective-Cノート(五)

3258 ワード

クラスの継承

  • 継承はクラス間の類似性
  • を反映する.
    円形クラス
    @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
    

    円形クラスと矩形クラスを比較すると,重複する部分が多いことが分かった.
    **継承はクラス間の類似性を反映します**
    シェイプクラス
    @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 , , 。
    
  • 継承を使用してRectangleクラス
  • を書く
      @interface Rectangle : Shape
      {
        double width;
        double height;
      }
      - (void)setWidth:(double)w;
      - (void)setHeight:(double)h;
      @end    
      
       , 。
    
  • ベース/親クラス派生クラス/子クラス
  • NSObjectクラスObjCのクラスはNSObjectクラス
  • を継承する
  • 完全実装例
  • 親Shapeクラス#import
      @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];// , 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];// !
        if (self) {
            width = 0.0;
            height = 0.0;
        }
        return self;
    }
    - (void)setWidth:(double)w {
        width = w;
    }
    - (void)setHeight:(double)h {
        height = h;
    }
    @end