@data 重写set方法_C#中的类、方法和属性
????這節(jié)講C#中的類(lèi),方法,屬性。這是面向?qū)ο缶幊讨?#xff0c;我們最直接打交道的三個(gè)結(jié)構(gòu)。
???類(lèi):
????類(lèi)(class)是面向?qū)ο笾凶罨镜膯卧?#xff0c;它是一種抽象,對(duì)現(xiàn)實(shí)世界中事物的抽象,在C#中使用class關(guān)鍵字聲明一個(gè)類(lèi):
class?MyClass{}????類(lèi)既然是一個(gè)抽象,我們使用的時(shí)候就要對(duì)其進(jìn)行實(shí)例化,通過(guò)new關(guān)鍵字實(shí)例化一個(gè)類(lèi)。
MyClass?myclass=new?MyClass();?????在實(shí)例化的同時(shí),我們還可以通過(guò)對(duì)象初始化器,對(duì)類(lèi)中的屬性進(jìn)行操作。
MyClass?myclass=new?MyClass(){屬性名=屬性值}????這對(duì)大括號(hào)就是對(duì)象初始化器,使用對(duì)象初始化器,如果使用的構(gòu)造方法是無(wú)參的,那么初始化器之前的小括號(hào)可以省略。
????每個(gè)類(lèi)都有一個(gè)構(gòu)造方法(constructor),構(gòu)造方法的名字必須跟類(lèi)名一致(我們實(shí)例類(lèi)的時(shí)候就是調(diào)用的這個(gè)方法),如果不顯式聲明類(lèi)的構(gòu)造方法,系統(tǒng)就會(huì)默認(rèn)生成一個(gè)無(wú)參的構(gòu)造方法。
class MyClass{ public MyClass(){}//構(gòu)造方法}????我們可以通過(guò)構(gòu)造方法為類(lèi)中的成員進(jìn)行初始化,這其實(shí)也是構(gòu)造方法的很重要的用途。
class MyClass{??public?bool isReal;??public?MyClass(bool?isreal){????this.isReal=isreal;??}//構(gòu)造方法}????以上代碼中出現(xiàn)了一個(gè)關(guān)鍵字this,this是指當(dāng)前對(duì)象,只能用在類(lèi)的內(nèi)部,以上代碼的意思是這個(gè)對(duì)象的IsReal屬性=isreal。
????需要注意的是,在執(zhí)行類(lèi)的構(gòu)造方法之前,會(huì)先執(zhí)行其父類(lèi)的無(wú)參的構(gòu)造方法,或者,我們指定父類(lèi)的有參的構(gòu)造,因?yàn)樽宇?lèi)繼承了父類(lèi),在實(shí)例化子類(lèi)的時(shí)候,必定要將繼承自父類(lèi)的成員也在內(nèi)存中創(chuàng)建出來(lái),注意,這并非是實(shí)例化父類(lèi)。
//使用上一節(jié)的代碼做演示public class Husky : Dog{????public?Husky()?:?base("Husky"){}//訪問(wèn)父類(lèi)的有參構(gòu)造,初始化屬性}????除了定義一般的類(lèi),我們還可以定義靜態(tài)類(lèi),抽象類(lèi),使用static class 聲明一個(gè)靜態(tài)類(lèi),類(lèi)中的屬性和方法也必須都是靜態(tài)的。
static?class?stClass{}? ??靜態(tài)類(lèi)在內(nèi)存中只有一份,它不需要實(shí)例化,在程序的一開(kāi)始就自動(dòng)加載,一般靜態(tài)類(lèi)都是作為工具類(lèi),拿來(lái)即用的。調(diào)用靜態(tài)方法,可以使用靜態(tài)類(lèi)名.方法名的形式,也可以使用using引入靜態(tài)類(lèi)名,就可以省略靜態(tài)類(lèi)名,直接調(diào)用方法名。
????使用abstract class 創(chuàng)建一個(gè)抽象類(lèi),抽象類(lèi)顧名思義是對(duì)類(lèi)的抽象,抽象類(lèi)中可以定義抽象方法(抽象方法的定義也是需要加上abstract關(guān)鍵字,抽象方法不能定義為私有的,私有的抽象方法是無(wú)意義的),也可以定義非抽象方法,它的作用就是將類(lèi)中的成員進(jìn)行抽象,以便更好地實(shí)現(xiàn)多態(tài)。包含了抽象方法的類(lèi)必須要定義成抽象類(lèi),抽象類(lèi)只能被繼承,不能被實(shí)例,它就像一個(gè)骨架一樣,具體的填充需要交給它的子類(lèi)。
abstract?class?IsAbstruct//定義抽象類(lèi){ public abstract void Shout ();//定義抽象方法}????另外,類(lèi)是可以嵌套的。嵌套的類(lèi)的作用域就縮小到了外部類(lèi)的作用域中。
????跟類(lèi)有關(guān)的還有一個(gè)原則:單一職責(zé)原則(Single Responsibility Principle),單一職責(zé)原則講的是一個(gè)類(lèi)應(yīng)該只有一個(gè)發(fā)生變化的原因(動(dòng)機(jī)),可以設(shè)想一個(gè)情景,開(kāi)高鐵的人沒(méi)法很好的開(kāi)汽車(chē),因?yàn)閮烧叩墓ぷ髟聿灰粯印.?dāng)一個(gè)類(lèi)服務(wù)兩個(gè)不太相關(guān)的業(yè)務(wù),那么這個(gè)類(lèi)就擁有多個(gè)職責(zé),我們就會(huì)有多個(gè)動(dòng)機(jī)去改變它,這樣的類(lèi)就違反了單一職責(zé)原則。
? ?方法:
? ? 方法聲明在類(lèi)的內(nèi)部,它定義了類(lèi)的行為,聲明一個(gè)方法,需要三個(gè)必要元素:返回值,方法名,方法參數(shù):
void?MyMethod(){}//無(wú)參,無(wú)返回值的方法int?MyMethodWithOneRetutn(){return?0;}//無(wú)參,返回值為intint?MyMethodWithOneArgOneRet(int?a){return?a+a;}//一個(gè)參數(shù),一個(gè)返回值????如果一個(gè)方法沒(méi)有返回值,那么它的返回類(lèi)型就是void,多個(gè)參數(shù)之間用逗號(hào)隔開(kāi)。方法還有一些前綴,比如訪問(wèn)修飾符,靜態(tài)修飾符,重寫(xiě)關(guān)鍵字等等。修飾符默認(rèn)的是private。
????方法是可以重載的,所謂重載,就是一個(gè)類(lèi)中可以存在相同方法名的方法,C#中,方法名和參數(shù)列表組成一個(gè)方法簽名,重載一個(gè)方法,只需要修改方法簽名中的參數(shù)列表即可。以下是一組重載方法:
public?void?RelodeOne(int?a){}public?void?RelodeOne(int?a,?int?b){}????方法的重載,使一個(gè)行為,可以有不同的動(dòng)作,或者說(shuō)擴(kuò)展了一個(gè)行為的覆蓋面。就好比吃飯(方法名),一個(gè)人(一個(gè)參數(shù))是吃飯,兩個(gè)人(兩個(gè)參數(shù))也是吃飯,行為是一樣的,但不同的人數(shù)吃飯, 做的菜多少也不一樣。
????編譯器會(huì)根據(jù)傳參的不同調(diào)用不同的重載方法。
????關(guān)于方法,還有一個(gè)知識(shí)點(diǎn),叫方法的重寫(xiě),它跟繼承有關(guān),如果想重寫(xiě)父類(lèi)的方法,那么父類(lèi)的方法,就要設(shè)置為virtual也就是虛方法,子類(lèi)重寫(xiě),需要使用關(guān)鍵字override。如果父類(lèi)不寫(xiě)virtual,子類(lèi)在重寫(xiě)時(shí)需要加上new關(guān)鍵字,下面演示這兩種情況:
class?OverFather{ public virtual void isvirtual() { Console.WriteLine("我是父類(lèi)虛方法"); } public virtual void isold() { Console.WriteLine("我是父類(lèi)老方法"); }}class OverWirteMethods : OverFather{ public void isvirtual() { Console.WriteLine("我是子類(lèi)真方法"); } public new void isold() { Console.WriteLine("我是子類(lèi)新方法");????????}}????在主方法中調(diào)用:
OverWirteMethods?o?=?new?OverWirteMethods();o.isvirtual();o.isold();????屬性:
????一個(gè)類(lèi)中,除了方法還有屬性,方法用來(lái)執(zhí)行動(dòng)作,屬性用來(lái)保存數(shù)據(jù)。屬性是個(gè)封裝結(jié)構(gòu),它是對(duì)外開(kāi)放的,類(lèi)中還有一種私有結(jié)構(gòu),叫字段,屬性就像是一個(gè)外殼,包裹著字段,不受非法數(shù)據(jù)的污染。
????將一個(gè)變量設(shè)置為私有的,就可將其稱之為字段,然后聲明一個(gè)屬性,來(lái)訪問(wèn)和修改這個(gè)字段。屬性通過(guò)get,set塊來(lái)獲取和修改數(shù)據(jù)。
????下面看一個(gè)演示:
private?bool?isFiled;//聲明一個(gè)字段public?bool?IsFiled//聲明一個(gè)屬性{????get?{?return?isFiled;?}//使用get塊獲取到字段的值????set?{?value?=?isFiled;?}//使用set塊設(shè)置字段的值?value是賦過(guò)來(lái)的值}????在get,set塊中就可以寫(xiě)一些邏輯,處理數(shù)據(jù)。如果省略其一,就形成了只讀或者只寫(xiě)屬性。
????另外,C#5推出了一個(gè)新的語(yǔ)法糖:自動(dòng)屬性:以上代碼就可以變化為這樣:
public?bool?IsFiled{get;set;}????自動(dòng)屬性無(wú)法對(duì)數(shù)據(jù)做處理,CLR自動(dòng)生成私有字段,只負(fù)責(zé)對(duì)字段的獲取或修改,但可以將get或set塊設(shè)置為私有的,或者也可以不寫(xiě)get,set,形成只讀或只寫(xiě)屬性(自我感覺(jué)自動(dòng)屬性就是為了少寫(xiě)代碼,沒(méi)啥特殊的)。
????本節(jié)到此結(jié)束...
總結(jié)
以上是生活随笔為你收集整理的@data 重写set方法_C#中的类、方法和属性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python中的匿名函数lambda
- 下一篇: c# char unsigned_dll