日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c 子类对象 访问父类对象受保护成员_面向对象编程(OOP)

發(fā)布時(shí)間:2024/7/23 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c 子类对象 访问父类对象受保护成员_面向对象编程(OOP) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

????這節(jié)講一下,什么是面向?qū)ο?Object Oriented Programming)。說面向?qū)ο笾?#xff0c;我們不得不提的是面向過程(Process Oriented Programming),C語言就是面向過程的語言,這兩者的區(qū)別在哪呢?我們可以設(shè)想一個(gè)情景——廚房做菜:

????以面向過程的形式解釋來說,第一步:準(zhǔn)備材料,第二步:起火,第三步:炒菜,第四步:上菜;面向過程就是編寫一個(gè)個(gè)函數(shù),每個(gè)函數(shù)執(zhí)行一部分操作,最后根據(jù)這一套函數(shù),執(zhí)行下來完成一個(gè)整體需求為目的。

????那面向?qū)ο竽?#xff0c;我們同樣的解釋做菜說,第一步:要有廚師,灶臺(tái),要有服務(wù)生,第二步:廚師準(zhǔn)備材料,第三步:灶臺(tái)起火,第四步:廚師炒菜,第五步:服務(wù)生上菜。面向?qū)ο蟮木幊谭绞?#xff0c;將原本各個(gè)獨(dú)立的函數(shù),用它所屬的對(duì)象規(guī)整了起來,并封裝成方法(面向?qū)ο笾械?#34;函數(shù)"有個(gè)新的稱呼叫方法Method)。雖然實(shí)際上代碼量會(huì)變多,但是這種編程思維是合情合理的,符合實(shí)際的,讓人更容易理解,因?yàn)槊總€(gè)對(duì)象的職責(zé)是明確的,從而后期維護(hù)會(huì)變得更方便。

????下面在代碼層面,演示一下面向?qū)ο蠛兔嫦蜻^程的區(qū)別:

????過程化:

#include "stdio.h"void Prepare(){ printf("準(zhǔn)備食材。\n");}void Fire(){ printf("起火\n");}void Cooking(){ printf("炒菜,\n"); printf("炒完了\n");}void Serve(){ printf("請(qǐng)享用。");}main(){ Prepare(); Fire(); Cooking(); Serve(); }

????對(duì)象化:

//創(chuàng)建三個(gè)對(duì)象//廚師class Cook{????//準(zhǔn)備食材的方法 public void Prepare() { Console.WriteLine("廚師準(zhǔn)備食材。"); }????//做飯的方法 public void Cooking() { Console.WriteLine("廚師正在做飯..."); Console.WriteLine("廚師做好了。"); }}//灶臺(tái)工具類static class CookingBench{????//靜態(tài)工具方法:起火 public static void Fire() { Console.WriteLine("灶臺(tái)生火。"); }}//服務(wù)員class Waiter{????//上菜方法 public void Serve() { Console.WriteLine("請(qǐng)享用。"); }}

????在主方法中調(diào)用:

Cook cook=new Cook();Waiter waiter=new Waiter();cook.Prepare();CookingBench.Fire();cook.Cooking();waiter.Serve();

????面向?qū)ο笥腥筇卣?#xff1a;封裝,繼承,多態(tài)。下面詳細(xì)講一下:

????封裝:

???每個(gè)人都有自己的秘密,在面向?qū)ο蟮拇a中也是如此,對(duì)象中,有可以被外界查看的,也有不對(duì)外界查看的,這種將一些成員隱藏起來的思想就是封裝,實(shí)現(xiàn)封裝,需要先了解一下四個(gè)訪問修飾符:public,?private, protect, internal

????訪問修飾符可以修飾類,屬性,方法,使用修飾符修飾類或?qū)傩浴⒎椒?#xff0c;具有不同的訪問級(jí)別。聲明時(shí)訪問修飾符要寫在最前:

public?class?publicClass{}//聲明一個(gè)類private?bool?isPublic;//聲明一個(gè)屬性

????public:公共的,這個(gè)訪問級(jí)別最低。

????private:私有的,故名思義,這個(gè)訪問級(jí)別最高,只能在聲明的作用域內(nèi)訪問。????protect:受保護(hù)的,只能在繼承鏈上被訪問,說白了只有繼承了一個(gè)類,才能訪問這個(gè)類中protect修飾的成員。

????internal:內(nèi)部的,只能在同一個(gè)程序集中訪問。可以狹義的理解為同一個(gè)命名空間下可以訪問。

????還有一個(gè)組合拳:protect internal,這就是既要滿足同一個(gè)程序集,又得是繼承的關(guān)系才能訪問。

????通過這幾個(gè)關(guān)鍵字,我們就可以實(shí)現(xiàn)封裝。開發(fā)的時(shí)候只需要明確寫的類或者屬性,方法等分配什么樣的訪問權(quán)限即可。

????繼承:

????繼承的概念,也很容易理解,它就好比現(xiàn)實(shí)生活中,孩子繼承父母的家產(chǎn),那么父母的東西就成了孩子的,在C#中,類和類之間實(shí)現(xiàn)繼承是通過":"來實(shí)現(xiàn)的。

public?class?Father{}public?class?Chlid:Father{}//Child類繼承了Father

????注意,C#是單繼承的語言,也就是說一個(gè)類只能繼承一個(gè)父類。

????子類可以繼承父類中非private的屬性或方法,如果private的屬性或方法能訪問,也就不會(huì)有protect這個(gè)關(guān)鍵字存在。通過繼承,我們可以將子類共有的重復(fù)代碼抽離到父類中,這樣所有的子類就不必聲明這些成員,就減少了很多代碼量。在C#的繼承結(jié)構(gòu)中,object類是所有類的父類,任何一個(gè)類都是默認(rèn)繼承object。object類為我們提供了一些類中最最基礎(chǔ)的成員,如我們常用的tostring()方法。

????面向?qū)ο笾杏袀€(gè)原則叫開閉原則,這個(gè)原則規(guī)定對(duì)修改封閉,對(duì)擴(kuò)展開放,也就是說,當(dāng)寫了一個(gè)類并使用了一段時(shí)間后,因?yàn)轫?xiàng)目升級(jí)或者其它原因,我們需要修改這個(gè)類(添加一些新東西),這時(shí),根據(jù)開閉原則,我們就不能直接修改,而是要再寫一個(gè)類,去繼承它,在子類中添加新的業(yè)務(wù)邏輯,這也是繼承的一個(gè)用途。

???繼承中,還有一個(gè)概念叫做方法的重寫,就是說,子類中有一個(gè)方法和繼承父類的方法名一樣,這樣子類方法就把父類方法給覆蓋了,這個(gè)過程就是重寫。這個(gè)概念在具體介紹類和方法的小節(jié)中會(huì)詳細(xì)展開。

????多態(tài):

????多態(tài)依賴?yán)^承,有繼承才能實(shí)現(xiàn)多態(tài)。同一個(gè)類,有不同的形態(tài)就是多態(tài)。比如狗這種動(dòng)物,有不同的形態(tài):哈士奇,田園犬,柯基等。在代碼中的體現(xiàn)就是父類可以接收子類為其賦值。還是拿上面的例子來說,以下代碼就是多態(tài)例子:

Father?f=new?Chlid();

????多態(tài)性的依據(jù)是里氏轉(zhuǎn)換原則:子類繼承父類,那么,原來適用于父類的場(chǎng)景,一定適用于子類,因?yàn)樽宇惱^承了父類的所有顯式功能,父類能做的,子類也能做。這一原則就是定義這個(gè)理論的存在,子類可以直接替代父類,將父類全部轉(zhuǎn)換為子類,程序的行為沒有區(qū)別。

????多態(tài)性也面向?qū)ο缶幊讨泻苤匾幕?#xff0c;我們一般在編程中盡可能地使用接口,面向抽象,降低耦合,因?yàn)槎鄳B(tài)性,我們才能通過接口或一些抽象的數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)實(shí)例的操作。

? ? 最后通過一個(gè)例子演示一下多態(tài)(涉及到類和方法的一些知識(shí)會(huì)在下節(jié)類和方法中詳解):

public class Dog{ public string name { get; set; } ????public?Dog(string?name) { this.name = name; } public void introduce() { Console.WriteLine("這是一只:" + name); }}public class Husky : Dog{????//調(diào)用父類的構(gòu)造方法,為name賦值????public?Husky():base("Husky"){}}public class Koji : Dog{ public Koji() : base("Koji"){}}class DogStore{ public Dog dog { get; set; } public DogStore(Dog dog) { this.dog = dog; } public void wantBuy() { Console.WriteLine("Do u want this "+dog.name+"?"); }}

????以上代碼中有一個(gè)共同的Dog類,分別有兩個(gè)類哈士奇,柯基繼承了它。還有一個(gè)寵物狗商店,需要Dog這個(gè)屬性。

????下面看一下主方法中的代碼:

DogStore dogStore=new DogStore(new Husky());dogStore.wantBuy();dogStore=new DogStore(new Koji());dogStore.wantBuy();

??我們通過父類,接收更加具體的子類,這就是多態(tài)性很好的體現(xiàn),這也是很優(yōu)雅高效的編程方式。

????本節(jié)到此結(jié)束...

總結(jié)

以上是生活随笔為你收集整理的c 子类对象 访问父类对象受保护成员_面向对象编程(OOP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。