1. 程式人生 > >Objective-c:封裝、繼承與多型

Objective-c:封裝、繼承與多型

面向物件的三個基本特徵是:封裝、繼承、多型。

封裝

簡介

  • 封裝是實現面向物件程式設計的第一步,封裝就是將資料或函式等集合在一個個的單元中(我們稱之為類)。被封裝的物件通常被成為抽象資料型別。

  • 封裝的意義在於保護和防止程式碼(資料)被我們無意中破壞。在面向物件程式設計中,資料被看作是一箇中心的元素並且和使用它的函式結合得很密切,從而保護它不被其他的函式意外地修改。

  • 封裝提供了一個有效的途徑來保護資料不被意外地破壞,相比我們將資料(用域來實現)在程式中定義為公有的(public),我們將它們(fields)定義為私有的(private),這在很多方面會更好。私有的資料可以用兩種方式來間接地控制:第一種,我們使用傳統的存、取方法;第二種,我們用屬性(property)。

  • 使用屬性不僅可以控制存取資料的合法性,同時也提供了“讀寫”、”只讀“、”只寫“靈活的操作方法。

  • 訪問修飾符有:@private、@protected、@public三種。當private、public、protected單純的作為一個類中的成員許可權設定時:private:只能由該類中的函式,不能被任何其他訪問,該類的物件也不能訪問。protected:可以被該類中的函式、子類的函式,但不能被該類的物件訪問。public:可以被該類中的函式、子類的函式、也可以由該類的物件訪問。OC中預設的成員屬性是@protected,也就是說明了為什麼物件不能直接訪問那些沒有定義屬性的變量了。屬性是類對外的介面。

繼承

簡介

  • 什麼是繼承?一個類可以從現有的類中派生出來,這個過程稱為繼承。新類稱為子類,而原始的被繼承的類稱為父類,有時候父類也會有自己的父類。繼承主要實現重用程式碼,節省開發時間,便於類的擴充套件。OC中只支援單繼承的方式。NSObject是所有類的基類。

語法

@interface 類名:父類名

注意

  • 繼承是面向物件程式設計的重要語法,OC是單繼承;

  • 通過繼承可以擁有父類的全部方法和屬性,比如我們可以把一個可變物件當做不可變物件使用,反之則不行;

  • 一般情況下,繼承NSObject類。

繼承特點

  • 使用繼承可以實現程式碼的複用,減少程式碼冗餘;

  • Objective-C中一個類可以繼承另一個類;

  • 子類可以直接“擁有”父類中所有允許子類繼承的成員和方法;

  • 子類可以改變父類中已有的方法,執行不同的程式碼實現。

繼承結構及相關術語

這裡寫圖片描述

示例

學生類

#import <Foundation/Foundation.h>

@interface Student : NSObject {
    NSInteger _age;
    NSString *_name;
    NSString *_code;
}

@end

教師類

#import <Foundation/Foundation.h>

@interface Teacher : NSObject {
    NSInteger _age;
    NSString *_name;
    NSString *_code;
    NSString *_address;
}

@end

從上面的 Student 類與 Teacher 類中可以看出,兩個類中都有 _name_code_age 變數,為了提高程式碼效率,減少冗餘,複用程式碼,可利用繼承對上述程式碼做修改,先建立一個Person類,如下:

#import <Foundation/Foundation.h>

@interface Person : NSObject {
    NSInteger _age;
    NSString *_name;
    NSString *_code;
}

@end

子類擁有父類的特性,因此只需將Student 類以及 Teacher 類繼承於 Person 類即可,如果有其他特性,則單獨定義,如下:

學生類

#import <Foundation/Foundation.h>

@interface Student : Person {

}

@end

教師類

#import <Foundation/Foundation.h>

@interface Teacher : Person {
    NSString *_address;
}

@end

上述示例中,Teacher 類 與 Student 類為 Person 類的子類,Teacher 類與 Student 類擁有 _name_code_age 變數,為繼承所得。

多型

定義

  • 在面嚮物件語言中,介面的多種不同的實現方式即為多型。換句話說,不同物件對同一訊息的不同響應。

  • 子類可以重寫父類的方法,多型就是允許方法重名,引數或返回值可以是父型別傳入或返回。

示例

學生類

@interface Student: NSObject

- (void)sayHello;

@end
@implementation Student

- (void)sayHello{
    NSLog(@”Hello, I'm a student!”);
}
@end

教師類

@interface Teacher: NSObject

- (void)sayHello;

@end
@implementation Teacher

- (void)sayHello{
    NSLog(@”Hello, I'm a teacher!”);
}
@end

關鍵字

self 關鍵字

  • 在類的方法中替代自身,或者說替代調方法的角色。(例項方法中為調方法的物件,類方法中為類本身)。

  • 可以直接呼叫本類或父類的方法。(方法重名時會直接呼叫本類的方法)。

super 關鍵字

  • 在類的方法中替代父類。

  • 只能用來呼叫父類的方法。(類中方法名與父類完全相同時,如果想要呼叫父類的方法,只能使用super,例如init方法)。

- (instancetype)init {
    self = [super init];
    if (self) {

    }
    return self;
}