C# 面向?qū)ο蠡A(chǔ)知識及實例

// See https://aka.ms/new-console-template for more information
using System;
namespace HelloWorldApplication
{
    /*
     *  虛方法:
     *      聲明為virtral的就是虛方法立镶⊥徽眨基類的虛方法可以在派生類中使用override進行重寫搜锰。
     *      重寫虛方法必須具有相同的可訪問性呀非,且基類方法不能是private
     *      不能重寫static方法或非虛方法
     *      方法泪喊,屬性蝇刀,索引器譬淳,事件募舟,都可以聲明為virtral或override
     *      
     *  多態(tài):
     *      通過指向派生類的基類調(diào)用祠斧,調(diào)用虛方法,會根據(jù)引用所指向派生類的實際類型拱礁,調(diào)用派生類中同名重寫的函數(shù)琢锋,即是多態(tài)。
     *  
     *  抽象方法:
     *      必須是方法呢灶,屬性吴超,事件,索引
     *      必須用abstract修飾符標(biāo)記
     *      不能有實現(xiàn)代碼塊
     *      
     *  抽象類:
     *      抽象類的存在目的是被繼承
     *      不能實例化鸯乃,用abstract修飾
     *      可以包含抽象成員和普通成員鲸阻,以及任意組合
     *      抽象類的抽象成員在派生類中需要用override關(guān)鍵字實現(xiàn)
     *      
     *  密閉類:
     *      聲明為sealed的類
     *      有些類不希望被其他人通過繼承來修改
     *  
     *  密閉方法:
     *      聲明為sealed的方法
     *      不希望其他人來重寫該方法
     *      如果一個基類方法不希望子類對其重寫,就可以不聲明為virtual
     *      如果是某個派生類方法不希望子類對其重寫缨睡,同時是override重寫,就可以使用sealed機制
     *      
     *  接口:
     *      指定一組函數(shù)成員鸟悴,而不實現(xiàn)他們的引用類型
     *      定義接口不能寫public,但默認(rèn)是public類型
     *      
     *  結(jié)構(gòu)和類:
     *      結(jié)構(gòu)是值類型(棧中)奖年,類是引用類型(堆中)
     *      結(jié)構(gòu)不支持繼承细诸,類支持繼承
     *      結(jié)構(gòu)不能定義默認(rèn)構(gòu)造函數(shù),編譯器會定義
     *  適用場合:
     *      結(jié)構(gòu):由于分配內(nèi)存快陋守,作用域結(jié)束即被刪除震贵,不需要垃圾回收機制利赋,用于小型數(shù)據(jù)結(jié)構(gòu)。
     *          但傳遞過程中會復(fù)制屏歹,應(yīng)該使用ref提高效率隐砸。
     *      類:用于其他的需要繼承體系的場合
     *      
     *  靜態(tài)成員:標(biāo)識為static的字段,方法蝙眶,屬性季希,構(gòu)造函數(shù),事件幽纷。
     *      被類的所有實例共享式塌,所有實例訪問同一個內(nèi)存地址
     *  生存期:獨立于任何實例,沒有實例也可以訪問友浸。
     *      其初始化語句在任何靜態(tài)成員使用之前調(diào)用
     *      
     *  靜態(tài)函數(shù)成員:
     *      獨立于任何實例峰尝,沒有實例也可以調(diào)用
     *      不能訪問實例成員,只能訪問其他靜態(tài)成員
     *      
     *  靜態(tài)構(gòu)造函數(shù):
     *      可用于初始化靜態(tài)字段
     *      在引用任何靜態(tài)成員之前收恢,和創(chuàng)建任何實例之前調(diào)用
     *      與類同名武学,使用static,無參數(shù)伦意,無訪問修飾符
     *      
     *  靜態(tài)類:
     *      類只包含了靜態(tài)的方法和屬性火窒,并標(biāo)識為static
     *      不能創(chuàng)建實例,不能被繼承
     *      可以為靜態(tài)類定義一個靜態(tài)構(gòu)造函數(shù)
     *      用于基礎(chǔ)類庫(如數(shù)學(xué)庫)或擴展方法
     *      
     *  擴展方法的要求
     *      擴展方法所屬的類必須是static類
     *      擴展方法本身必須是static方法
     *      擴展方法的第一個參數(shù)類型驮肉,必須是this+類名
     *      
     *  裝箱:淺拷貝
     *      根據(jù)值類型的值熏矿,在堆上創(chuàng)建一個完整的引用類型對象,并返回對象的引用离钝,是一種隱式轉(zhuǎn)換
     *      有時候需要將值類型轉(zhuǎn)化為引用類型(例如object)來進行統(tǒng)一的操作(例如作為函數(shù)的參數(shù))和統(tǒng)一的存儲(例object[])
     *      在堆上創(chuàng)建引用類型的副本票编,新創(chuàng)建的引用類型和原本的值類型相互獨立
     *      
     *  拆箱:
     *      將裝箱后的對象轉(zhuǎn)換成值類型的過程,是一種顯示轉(zhuǎn)換
     *      
     *  自定義轉(zhuǎn)換:
     *      為自己的結(jié)構(gòu)或類定義顯示和隱式轉(zhuǎn)換
     *  隱式轉(zhuǎn)換:public static implicit operator Dog(Cat cat) 目標(biāo)類型(原類型)
     *  顯示轉(zhuǎn)換:public static explicit operatir Dog(Cat cat)
     *  
     *  重載運算符:
     *      利用現(xiàn)有的某種運算符卵渴,針對自定義類或結(jié)構(gòu)慧域,定義某種運算符
     *      
     *  泛型類:class Cage<T>
     *      就是一個模子,裝入類型的材料奖恰,可以塑造想要的產(chǎn)品
     *      易于維護吊趾,修改模板,所有的實例都會被改變
     *      只有需要的類型才會被實例化
     *      
     *  泛型方法:
     *      就是方法的模型瑟啃,給定具體的類型论泛,就可以實例化出一個操作該類型的具體方法
     *   
     *  泛型接口:
     *      允許我們將接口成員的參數(shù)和返回類型設(shè)置成為泛型參數(shù)的接口
     *      
     *  約束:
     *      縮小泛型參數(shù)的范圍
     *      只有添加了約束,才能調(diào)用泛型參數(shù)中(比如T)的方法
     *      
     *  集合:
     *      動態(tài)數(shù)組:ArrayList  列表:List   字典:Dictionary    
     *      隊列:Queue    棧:Stack
     *      
     *  動態(tài)數(shù)組 ArrayList:
     *      初始化可以不指定大小
     *      獲取長度蛹屿,使用Count屬性
     *      添加Add屁奏,刪除Remove,RemoveAt,訪問[index]
     *      類型不安全错负,有裝箱拆箱的性能問題坟瓢,于是出現(xiàn)了List<T>
     *     
     *  字典 Dictionary<Tkey,Tvalue>:
     *      存儲的是一系列的鍵值對
     *      數(shù)量 Count    添加 Add(key,value)   刪除 Remove   訪問 [key]
     *      
     *  棧 Stack:
     *      出棧 Pop    入棧 Push     獲取棧頂元素 Peek
     *      
     *  隊列 Queue:
     *      出隊 Dequeue      入隊 enqueue
     *      
     *  委托:
     *      持有一個或者多個方法的對象勇边,并且該方法可以執(zhí)行,傳遞
     *      
     *  聲明委托方法:
     *      可以聲明折联,是一種引用類型    delegate void ActCute();
     *      
     *  Lambda 表達式
     *      del = delegate(){} del = ()=>{}
     *      
     *  事件:
     *  發(fā)布者:通知事件發(fā)生的
     *  訂閱者:對某件事情關(guān)注的
     *  事件觸發(fā):事件發(fā)生時粒褒,會通知所有關(guān)注該事件的訂閱者
     *  注冊:想要在事件發(fā)生時被通知,必須注冊以表示關(guān)注
     */
    /*
    struct fish
    {
        int weight;
        int size;
        int type;
    }
    */
    interface ICatchMice
    {
        void CatchMice();
    }

    interface ICimbTree
    {
        void CimbTree();
    }
    abstract public class Pet
    {   
        public Pet(string name)
        {
            _name = name;
            _age = 0;
        }
        // 受保護 讓派生類可以訪問
        protected string _name;
        protected int _age;
        public void PrintName()
        {
            Console.WriteLine("寵物的名字是:"+_name);
        }
        abstract public void Speak();

        public void ShowAge()
        {
            Console.WriteLine(_name + "年齡是:"+ _age);
        }
        public static Pet operator ++(Pet pet)
        {
            ++pet._age;
            return pet;
        }
    }
    public class Cage<T>
    {
        T[] array;
        readonly int Size;
        int num;
        public Cage(int n)
        {
            Size = n;
            array = new T[Size];
            num = 0;    
        }

        public void Putin(T pet)
        {
            if (num < Size)
            {
                array[num++] = pet;
            }
            else
            {
                Console.WriteLine("籠子已經(jīng)裝滿了...");
            }
        }
        public T TakeOut()
        {
            if (num > 0)
            {
                return array[--num];
            }
            else
            {
                Console.WriteLine("籠子是空的...");
                return default(T);
            }
        }
    }
    public class Dog : Pet 
    {
        static int Num;
        // 委托
        public delegate void Hander();
        // 事件
        public static event Hander NewDog;
        static Dog()
        {
            Num = 0;
        }
        public Dog(string name) : base(name)
        {
            ++Num;
            if (NewDog != null)
            {
                NewDog();
            }
        }
        // 隱藏基類方法
        new public void PrintName()
        {
            Console.WriteLine("狗的名字是:" + _name);
        }
        sealed override public void Speak()
        {
            Console.WriteLine(_name + "在說話:汪汪");
        }
        static public void ShowNum()
        {
            Console.WriteLine("一共有" + Num + "只狗");
        }

        // 隱式轉(zhuǎn)換
        public static implicit operator Cat(Dog dog)
        {
            return new Cat(dog._name);
        }

        // 泛型方法
        public void IsHappy<T>(T target) where T : Pet
        {
            Console.WriteLine("很開心看到");
            target.PrintName();
        }

        public void WagTail()
        {
            Console.WriteLine(_name + "搖尾巴");
        }
    }

    public abstract class DogCmd
    {
        public abstract string GetCmd();   
    }
    public class SitDogCmd : DogCmd
    {
        public override string GetCmd()
        {
            return "坐下";
        }
    }
    public interface IDogLearn <C> where C : DogCmd
    {
        void Act(C cmd);
    }
    public class Labrador : Dog, IDogLearn<SitDogCmd>
    {
        public Labrador(string name):base(name)
        {
        }
        public void Act(SitDogCmd cmd)
        {
            Console.WriteLine(cmd.GetCmd());
        }
    }

    static class PetGuide
    {
        static public void HowToFeedDog(this Dog dog)
        {
            Console.WriteLine("喂養(yǎng)一條狗");
        }
    }

    public class Cat : Pet, ICatchMice, ICimbTree
    {
        public Cat(string name) : base (name)
        {
        }
        public override void Speak()
        {
            Console.WriteLine(_name + "在說話:喵喵");
        }

        public void CatchMice()
        {
            Console.WriteLine(_name + "在抓老鼠");
        }
        public void CimbTree()
        {
            Console.WriteLine(_name + "在爬樹");
        }
        public static explicit operator Dog(Cat cat)
        {
            return new Dog(cat._name);
        }

        public void InnocentLook()
        {
            Console.WriteLine(_name + "看著你");
        }
    }
    class Person
    {

    }
    class Client
    {
        public void WantDog()
        {
            Console.WriteLine("有一條新的狗...");
        }
    }
    class HelloWorld
    {
        // 委托
        delegate void ActCute();
        static void Main(string[] args)
        {
            ActCute del = null;
            Dog d1 = new Dog("d1");
            Cat c1 = new Cat("C1");
            del = d1.WagTail;
            del += c1.InnocentLook;
            del += () =>
            {
                Console.WriteLine("Lambda表達式");
            };
            del();

            Pet[] pets = new Pet[] {new Dog("小狗"),new Cat("小貓"),new Dog("小白狗")};
            for(int k=0;k<pets.Length;k++)
            {
                pets[k].Speak();
                ++pets[k];
                pets[k].ShowAge();
            }

            Cat c = new Cat("小白貓");
            // 強制轉(zhuǎn)換
            ICatchMice catchM = (ICatchMice)c;
            c.CatchMice();
            catchM.CatchMice();
            ICimbTree cimbT = (ICimbTree)c;
            c.CimbTree();
            cimbT.CimbTree();
            Dog.ShowNum();

            Dog dog = new Dog("大狗");
            dog.HowToFeedDog();

            int i = 3;
            object ob = i;
            Console.WriteLine("i=" + i + " ob=" + ob.ToString());
            i = 5;
            ob = 6;
            Console.WriteLine("i=" + i + " ob=" + ob.ToString());
            int j = (int)ob;
            Console.WriteLine("j=" + j);

            Dog dog1 = new Dog("比格");
            dog1.Speak();
            Cat cat = dog1;
            cat.Speak();
            cat.PrintName();

            Dog dog2 = (Dog)cat;
            dog2.Speak();

            var dogCage = new Cage<Dog>(1);
            dogCage.Putin(new Dog("小狗一號"));
            dogCage.Putin(new Dog("小狗二號"));

            var dogC = dogCage.TakeOut();
            dogC.PrintName();

            Dog dog3 = new Dog("哈士奇");
            //dog3.IsHappy<int>(2);
            dog3.IsHappy<Cat>(new Cat("英短"));

            Labrador labrador = new Labrador("拉不拉多");
            labrador.Act(new SitDogCmd());

            List<Dog> list = new List<Dog>();
            list.Add(new Dog("小黑"));
            list.Add(new Dog("小花"));
            list.Add(new Dog("小白"));
            list.RemoveAt(1);
            for (int p = 0; p < list.Count; p++)
            {
                list[p].PrintName();
            }

            Dictionary<string, Dog> dic = new Dictionary<string, Dog>();
            dic.Add("A",new Dog("A1"));
            dic["A"].PrintName();

            Stack<Pet> st = new Stack<Pet>();
            st.Push(new Dog("a"));
            st.Push(new Dog("b"));
            st.Peek().PrintName();

            Queue<Pet> qu = new Queue<Pet>();
            qu.Enqueue(new Dog("q1"));
            qu.Enqueue(new Dog("q2"));
            Pet pe = null;
            pe = qu.Dequeue();
            pe.PrintName();


            Client cl1 = new Client();
            Client cl2 = new Client();
            Dog.NewDog += cl1.WantDog;
            Dog.NewDog += cl2.WantDog;
            Dog dogs = new Dog("大狗");

            /*
            Pet dog = new Dog();
            dog._name = "小狗";
            dog.PrintName();
            dog.Speak();
            Pet cat = new Cat();
            cat._name = "小貓";
            cat.PrintName();
            cat.Speak();
            */
        }
    }
}

運行結(jié)果

d1搖尾巴
C1看著你
Lambda表達式
小狗在說話:汪汪
小狗年齡是:1
小貓在說話:喵喵
小貓年齡是:1
小白狗在說話:汪汪
小白狗年齡是:1
小白貓在抓老鼠
小白貓在抓老鼠
小白貓在爬樹
小白貓在爬樹
一共有3只狗
喂養(yǎng)一條狗
i=3 ob=3
i=5 ob=6
j=6
比格在說話:汪汪
比格在說話:喵喵
寵物的名字是:比格
比格在說話:汪汪
籠子已經(jīng)裝滿了...
狗的名字是:小狗一號
很開心看到
寵物的名字是:英短
坐下
狗的名字是:小黑
狗的名字是:小白
狗的名字是:A1
寵物的名字是:b
寵物的名字是:q1
有一條新的狗...
有一條新的狗...
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诚镰,一起剝皮案震驚了整個濱河市奕坟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌清笨,老刑警劉巖月杉,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抠艾,居然都是意外死亡苛萎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門检号,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腌歉,“玉大人,你說我怎么就攤上這事齐苛【柯模” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵脸狸,是天一觀的道長。 經(jīng)常有香客問我藐俺,道長炊甲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任欲芹,我火速辦了婚禮卿啡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菱父。我一直安慰自己颈娜,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布浙宜。 她就那樣靜靜地躺著官辽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粟瞬。 梳的紋絲不亂的頭發(fā)上同仆,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音裙品,去河邊找鬼俗批。 笑死俗或,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的岁忘。 我是一名探鬼主播辛慰,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼干像!你這毒婦竟也來了帅腌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蝠筑,失蹤者是張志新(化名)和其女友劉穎狞膘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體什乙,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡挽封,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了臣镣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辅愿。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖忆某,靈堂內(nèi)的尸體忽然破棺而出点待,到底是詐尸還是另有隱情,我是刑警寧澤弃舒,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布癞埠,位于F島的核電站,受9級特大地震影響聋呢,放射性物質(zhì)發(fā)生泄漏苗踪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一削锰、第九天 我趴在偏房一處隱蔽的房頂上張望通铲。 院中可真熱鬧,春花似錦器贩、人聲如沸颅夺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吧黄。三九已至,卻和暖如春稳摄,著一層夾襖步出監(jiān)牢的瞬間稚字,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胆描,地道東北人瘫想。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像昌讲,于是被迫代替她去往敵國和親国夜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容