物件導向有三大特徵,它們分別是封裝、繼承、多型。下面我就這幾大特徵做乙個簡單的說明。
1、封裝
1)、定義
封裝,即把客觀事物封裝成抽象的類,並且這類可以把自己的資料和方法只可以讓可信的類或者物件來操作,對不可信的進行資訊隱藏。
2)、運用
在程式中,我們用get
和set
來給我們的類成員進行封裝,讓外界不能順便訪問或者改變成員變數的值,達到使我們的成員變數得到保護。
set方法就是外界用它給我們的成員變數賦值的,通常寫法為,
#import @inte***ce point2d : nsobject
@end
@implementation point2d
- (void)setx:(double)x // x值的set方法
@end
get方法就是把我們外部檢視成員變數的值。通常寫法為,
@inte***ce point2d : nsobject
@end
@implementation point2d
- (double)x // x值的get方法
@end
3)、使用注意事項
set和
get命名規範:
set
,它的返回值為
void
,並且函式名要用
set+
成員變數名稱
(當然不能一樣
),後賦值的型別面要加引數,即給成員變數賦的值(需要寫清楚所)
get,它坑定有返回值,且與成員變數一樣,方法名不用
get開頭,與成員變數類似,丹奴能一樣。並且不接受引數。
實質上為了區分方法名與成員變數,我們習慣在成員變數的前面寫「_」,
這樣就能區分方法名與成員變數了。
2、繼承
1)、定義
繼承,它是指一種能力,即它可以使用現有類的所有功能,而不需要重寫原來的類的方法和實現,並且對原來的功能進行擴充套件。
2)、運用
當乙個類a
包含了另乙個類b時,
b要用a中的屬性和方法的時候,繼承就可以派上用場了。我們就不用在
b中重寫這些屬性和方法。比如,
person
是乙個類,
worker
也是乙個類,但我們知道
worker
一定是person
,那麼我們就可以用
worker
繼承person
。常這樣寫,
#import @inte***ce person : nsobject // 人這個類的宣告
@end
@implementation animal
- (void)setage:(int)age // 年齡的setter
- (int)age // 年齡的getter
@end
@inte***ce worker : person // 工人這個類的宣告
@end
3)、使用注意
a、父類要放在子類的前面,子類和父類不能有相同的成員變數,重寫子類
shi'x
實現方法會覆蓋父類的實現方法。
b、這種繼承有乙個缺點就是,耦合性太強了,只能是
a類包涵了
b類才能使用,但,比如
student
有分數,成績也有分,但是成績不是
student
,因此這就不能用繼承了。但是
oc中還有乙個座位繼承的補充的
———組合。組合,就是只要a要用
b中的屬性方法都可以去呼叫,而不需要考慮它們的關係。用法如下,
#import @inte***ce record : nsobject // 成績類的宣告
@end
@implementation record // 成績類的實現
- (void)setscore:(int)score
- (int)score
@end
@inte***ce student : nsobject // 學生類的宣告
- (void)setscore : (record *)score;
- (record *)score;
@end
@implementation student // 學生方法的實現
-(void)setscore : (record *)score
- (record *)score
@end
3、多型
1)、定義
多型,即允許你將父類物件設定成為和乙個或者多個它的子物件相等的技術,賦值以後,父類物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單來說就是允許將子類的指標賦值交給父類型別的指標。
2)、運用
多型運用的乙個前提是要有繼承關係。當c、b
同時繼承了a,但
b有一方法實現乙個動作,然而,
c同樣也需要實現這乙個相同的動作,但
c不能直接呼叫
b中的方法。,然後那麼我們就出現了多型,即把子類的新建物件賦值給父類指標,再把這一行為做成乙個函式,並且可以傳入子類物件,例如
喂cat
和dog
,它們都是動物,即
animal
void feed(animal *a)
int main()
3)、使用注意
父類不型別的變數不能直接呼叫子類特有的方法,要呼叫即必須強制轉換,dog *d = (dog *)a
下面就是乙個關於oc
三個特性的乙個例子:
/*
計算兩點之間的距#*/
#import #import @inte***ce point2d : nsobject
// x的getter和setter
- (void)setx:(double)x;
- (double)x;
// y的getter和setter
- (void)sety:(double)y;
- (double)y;
// 給物件點的x,y設定值
- (void)setx:(double)x andy:(double)y;
//用物件方法計算距離
- (double)distancewithother:(point2d *)other;
//用類方法計算距離
+ (double)distancebettwenpointa:(point2d *)a andpointb:(point2d *)b;
@end
@implementation point2d
// x的getter和setter
- (void)setx:(double)x
- (double)x
// y的getter和setter
- (void)sety:(double)y
- (double)y
// 給物件點的x,y設定值
- (void)setx:(double)x andy:(double)y
//用物件方法計算距離
- (double)distancewithother:(point2d *)other
// 用類方法計算兩點的距離
+ (double)distancebettwenpointa:(point2d *)a andpointb:(point2d *)b
@end
/*int main()
*/ //判斷兩個圓是否有重疊部分
#import // 建立乙個園的類
@inte***ce circle : nsobject
// 圓半徑的宣告
- (double)radius;
- (void)setradius:(double)radius;
// 圓心的宣告
- (point2d *)point;
- (void)setpoint:(point2d *)point;
// 判斷兩個圓是否有重合部分的物件方法宣告
- (bool)ispublicbetweencircleandother:(circle *)circleother;
// 判斷兩個圓是否有重合部分的類方法宣告
+ (bool)ispublicbetweencirclea:(circle *)circlea andcircleb:(circle *)circleb;
@end
@implementation circle
// 圓半徑的getter、setter
- (double)radius
- (void)setradius:(double)radius
//圓心的getter、setter
- (point2d *)point
- (void)setpoint:(point2d *)point
// 判斷兩個圓是否有重合部分的物件方法實現
- (bool)ispublicbetweencircleandother:(circle *)circleother
// 判斷兩個圓是否有重合部分的類方法實現
+ (bool)ispublicbetweencirclea:(circle *)circlea andcircleb:(circle *)circleb;
@end
int main()
OC 屬性的三大特性
屬性的三大特性 1.讀寫特性.寫 setter方法 讀 getter方法 1 readwrite 可讀可寫 該屬性既會生成getter方法,也會生成setter方法.預設的讀寫特性.2 readonly 唯讀 該屬性只會生成getter方法,不會生成setter方法.3 setter 方法名 aa ...
OC的三大特性之繼承
繼承的好處 1 抽取重複 2 建立了類之間的關係 3 子類可以擁有父類中的所有成員變數和方法 注意點 1 基本上所有類的根類是nsobject import animal的宣告 inte ce animal nsobject void setage int age int age void setw...
OC的三大特性之多型
多型 1.沒有繼承就沒有多型 2.的體現 父類型別的指標指向子類物件 3.好處 如果函式 方法引數中使用的是父類型別,可以傳入父類 子類物件 4.侷限性 1 父類型別的變數 不能 直接呼叫子類特有的方法。必須強轉為子類型別變數後,才能直接呼叫子類特有的方法 import 動物 inte ce ani...