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;
}