程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> OC

OC

編輯:關於C

一下純屬個人觀點,如有雷同,純屬巧合!

首先溫習一下我們所熟知的OC中關於繼承的一些常識

子類可以繼承父類的:public/protect修飾的成員變量(“屬性”或者叫“字段”)。private修飾的不可被被繼承

~~~~溫習完畢之後,那麼問題來了·········

在OC中子類到底能不能繼承父類被private修飾的屬性呢?

個人在寫程序的時候經常會偷懶,比如:

父類Fun有一屬性:name,那麼聲明的時候為了省勁經常這麼寫:


@property(nonatomic,copy)NSStirng *name;


子類繼承父類之後,子類也有了name這個屬性了是不是。用得時候就這麼用了


self.name = @"張三";

NSLog("%@",self.name);


但在以前我卻從來沒有考慮過這個name是什麼屬性的,後來當碰到這類問題時我猜想它使protect,但是protect修飾的屬性

在子類中還可以這麼用:


_name = "張三";

NSLog("%@",_name);


而property卻不可以,網上說這個是缺省的,缺省的就是私有的,叫獸說過:私有的是不能夠被繼承的-----你是不是在逗我,我跟著叫獸這麼用都習慣了

現在才發現叫獸自己挖了個坑自己又往裡面跳,而且居然還沒意識到自己掉坑裡了,更沒有意識到坑還是自己挖的。

那到底property聲明的是不是私有的?私有的是不是能夠被子類繼承?

本人首先測試了私有屬性的繼承性:過程如下所述

定義一個父類Fun,子類FunA、FunB

Fun的私有屬性:

@private NSString *_name;


公共函數:

//name的 setter 函數

- (void)setNameWith:(NSString *)newName{

_name = newName;

}


//name的getter函數

- (NSString *)getName{

return _name;

}


//打印函數:NSStringFromClass([self class])是當前調用此函數的類的名稱

- (void)print{

NSLog("%@--->%@",NSStringFromClass([self class]),_name);

}

父類的屬性和函數到此就完結了,然後就是論證了

論證依據是:

父類的私有字段賦值:name = @"皇上",如果父類的私有屬性不能被繼承,然後FunB調用打印函數

結果應該“皇上”,

FunA調用name的setter函數並傳值:“太子A”,然後FunB調用打印函數,結果應該為:“太子A”,

如果以上成立,private屬性不能被繼承的結論成立


論證過程:

分別創建三個對象:


Fun *fun = [[Fun alloc] init];

FunA *funA = [[Fun alloc] init];

FunB *funB = [[Fun alloc] init];


[fun setName:@"皇上"];

[fun print];

[funA print];

[funB print];


打印結果:

2014-12-28 16:53:47.993 test---property[1669:60b] Fun---> 皇上

2014-12-28 16:53:47.993 test---property[1669:60b] FunA---> (null)

2014-12-28 16:53:47.993 test---property[1669:60b] FunB----> (null)


續接上面的代碼繼續敲:

[funA setName:@"太子A"];

[funB setName:@"太子B"];

[fun print];

[funA print];

[funB print];


打印結果:

2014-12-28 16:53:47.993 test---property[1669:60b] Fun---> 皇上

2014-12-28 16:53:47.993 test---property[1669:60b] FunA---> 太子A

2014-12-28 16:53:47.993 test---property[1669:60b] FunB----> 太子B

這個結果應該可以說明private修飾的屬性是可以被子類繼承的。所以,平常僅僅使用一個@property來聲明創建一個屬性,

這個屬性的屬性是private,子類可以繼承使用這個屬性,只不過需要通過父類提供的函數而已


子類可以繼承父類的私有屬性,但是,如果父類沒有為子類提供操作這個私有屬性的函數,那麼糾結繼承與否已經沒有什麼意義了


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved