c 子类对象 访问父类对象受保护成员_面向对象编程(OOP)
????這節講一下,什么是面向對象(Object Oriented Programming)。說面向對象之前,我們不得不提的是面向過程(Process Oriented Programming),C語言就是面向過程的語言,這兩者的區別在哪呢?我們可以設想一個情景——廚房做菜:
????以面向過程的形式解釋來說,第一步:準備材料,第二步:起火,第三步:炒菜,第四步:上菜;面向過程就是編寫一個個函數,每個函數執行一部分操作,最后根據這一套函數,執行下來完成一個整體需求為目的。
????那面向對象呢,我們同樣的解釋做菜說,第一步:要有廚師,灶臺,要有服務生,第二步:廚師準備材料,第三步:灶臺起火,第四步:廚師炒菜,第五步:服務生上菜。面向對象的編程方式,將原本各個獨立的函數,用它所屬的對象規整了起來,并封裝成方法(面向對象中的"函數"有個新的稱呼叫方法Method)。雖然實際上代碼量會變多,但是這種編程思維是合情合理的,符合實際的,讓人更容易理解,因為每個對象的職責是明確的,從而后期維護會變得更方便。
????下面在代碼層面,演示一下面向對象和面向過程的區別:
????過程化:
#include "stdio.h"void Prepare(){ printf("準備食材。\n");}void Fire(){ printf("起火\n");}void Cooking(){ printf("炒菜,\n"); printf("炒完了\n");}void Serve(){ printf("請享用。");}main(){ Prepare(); Fire(); Cooking(); Serve(); }????對象化:
//創建三個對象//廚師class Cook{????//準備食材的方法 public void Prepare() { Console.WriteLine("廚師準備食材。"); }????//做飯的方法 public void Cooking() { Console.WriteLine("廚師正在做飯..."); Console.WriteLine("廚師做好了。"); }}//灶臺工具類static class CookingBench{????//靜態工具方法:起火 public static void Fire() { Console.WriteLine("灶臺生火。"); }}//服務員class Waiter{????//上菜方法 public void Serve() { Console.WriteLine("請享用。"); }}????在主方法中調用:
Cook cook=new Cook();Waiter waiter=new Waiter();cook.Prepare();CookingBench.Fire();cook.Cooking();waiter.Serve();????面向對象有三大特征:封裝,繼承,多態。下面詳細講一下:
????封裝:
???每個人都有自己的秘密,在面向對象的代碼中也是如此,對象中,有可以被外界查看的,也有不對外界查看的,這種將一些成員隱藏起來的思想就是封裝,實現封裝,需要先了解一下四個訪問修飾符:public,?private, protect, internal
????訪問修飾符可以修飾類,屬性,方法,使用修飾符修飾類或屬性、方法,具有不同的訪問級別。聲明時訪問修飾符要寫在最前:
public?class?publicClass{}//聲明一個類private?bool?isPublic;//聲明一個屬性????public:公共的,這個訪問級別最低。
????private:私有的,故名思義,這個訪問級別最高,只能在聲明的作用域內訪問。????protect:受保護的,只能在繼承鏈上被訪問,說白了只有繼承了一個類,才能訪問這個類中protect修飾的成員。
????internal:內部的,只能在同一個程序集中訪問。可以狹義的理解為同一個命名空間下可以訪問。
????還有一個組合拳:protect internal,這就是既要滿足同一個程序集,又得是繼承的關系才能訪問。
????通過這幾個關鍵字,我們就可以實現封裝。開發的時候只需要明確寫的類或者屬性,方法等分配什么樣的訪問權限即可。
????繼承:
????繼承的概念,也很容易理解,它就好比現實生活中,孩子繼承父母的家產,那么父母的東西就成了孩子的,在C#中,類和類之間實現繼承是通過":"來實現的。
public?class?Father{}public?class?Chlid:Father{}//Child類繼承了Father????注意,C#是單繼承的語言,也就是說一個類只能繼承一個父類。
????子類可以繼承父類中非private的屬性或方法,如果private的屬性或方法能訪問,也就不會有protect這個關鍵字存在。通過繼承,我們可以將子類共有的重復代碼抽離到父類中,這樣所有的子類就不必聲明這些成員,就減少了很多代碼量。在C#的繼承結構中,object類是所有類的父類,任何一個類都是默認繼承object。object類為我們提供了一些類中最最基礎的成員,如我們常用的tostring()方法。
????面向對象中有個原則叫開閉原則,這個原則規定對修改封閉,對擴展開放,也就是說,當寫了一個類并使用了一段時間后,因為項目升級或者其它原因,我們需要修改這個類(添加一些新東西),這時,根據開閉原則,我們就不能直接修改,而是要再寫一個類,去繼承它,在子類中添加新的業務邏輯,這也是繼承的一個用途。
???繼承中,還有一個概念叫做方法的重寫,就是說,子類中有一個方法和繼承父類的方法名一樣,這樣子類方法就把父類方法給覆蓋了,這個過程就是重寫。這個概念在具體介紹類和方法的小節中會詳細展開。
????多態:
????多態依賴繼承,有繼承才能實現多態。同一個類,有不同的形態就是多態。比如狗這種動物,有不同的形態:哈士奇,田園犬,柯基等。在代碼中的體現就是父類可以接收子類為其賦值。還是拿上面的例子來說,以下代碼就是多態例子:
Father?f=new?Chlid();????多態性的依據是里氏轉換原則:子類繼承父類,那么,原來適用于父類的場景,一定適用于子類,因為子類繼承了父類的所有顯式功能,父類能做的,子類也能做。這一原則就是定義這個理論的存在,子類可以直接替代父類,將父類全部轉換為子類,程序的行為沒有區別。
????多態性也面向對象編程中很重要的基石,我們一般在編程中盡可能地使用接口,面向抽象,降低耦合,因為多態性,我們才能通過接口或一些抽象的數據結構來實現實例的操作。
? ? 最后通過一個例子演示一下多態(涉及到類和方法的一些知識會在下節類和方法中詳解):
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{????//調用父類的構造方法,為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+"?"); }}????以上代碼中有一個共同的Dog類,分別有兩個類哈士奇,柯基繼承了它。還有一個寵物狗商店,需要Dog這個屬性。
????下面看一下主方法中的代碼:
DogStore dogStore=new DogStore(new Husky());dogStore.wantBuy();dogStore=new DogStore(new Koji());dogStore.wantBuy();??我們通過父類,接收更加具體的子類,這就是多態性很好的體現,這也是很優雅高效的編程方式。
????本節到此結束...
總結
以上是生活随笔為你收集整理的c 子类对象 访问父类对象受保护成员_面向对象编程(OOP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: update关联一个视图的时候特别慢_实
- 下一篇: 计算机二级必备快捷键知识,计算机二级考试