C# 面向对象基础知识及实例

// See https://aka.ms/new-console-template for more information
using System;
namespace HelloWorldApplication
{
    /*
     *  虚方法:
     *      声明为virtral的就是虚方法。基类的虚方法可以在派生类中使用override进行重写。
     *      重写虚方法必须具有相同的可访问性,且基类方法不能是private
     *      不能重写static方法或非虚方法
     *      方法,属性,索引器,事件,都可以声明为virtral或override
     *      
     *  多态:
     *      通过指向派生类的基类调用,调用虚方法,会根据引用所指向派生类的实际类型,调用派生类中同名重写的函数,即是多态。
     *  
     *  抽象方法:
     *      必须是方法,属性,事件,索引
     *      必须用abstract修饰符标记
     *      不能有实现代码块
     *      
     *  抽象类:
     *      抽象类的存在目的是被继承
     *      不能实例化,用abstract修饰
     *      可以包含抽象成员和普通成员,以及任意组合
     *      抽象类的抽象成员在派生类中需要用override关键字实现
     *      
     *  密闭类:
     *      声明为sealed的类
     *      有些类不希望被其他人通过继承来修改
     *  
     *  密闭方法:
     *      声明为sealed的方法
     *      不希望其他人来重写该方法
     *      如果一个基类方法不希望子类对其重写,就可以不声明为virtual
     *      如果是某个派生类方法不希望子类对其重写,同时是override重写,就可以使用sealed机制
     *      
     *  接口:
     *      指定一组函数成员,而不实现他们的引用类型
     *      定义接口不能写public,但默认是public类型
     *      
     *  结构和类:
     *      结构是值类型(栈中),类是引用类型(堆中)
     *      结构不支持继承,类支持继承
     *      结构不能定义默认构造函数,编译器会定义
     *  适用场合:
     *      结构:由于分配内存快,作用域结束即被删除,不需要垃圾回收机制,用于小型数据结构。
     *          但传递过程中会复制,应该使用ref提高效率。
     *      类:用于其他的需要继承体系的场合
     *      
     *  静态成员:标识为static的字段,方法,属性,构造函数,事件。
     *      被类的所有实例共享,所有实例访问同一个内存地址
     *  生存期:独立于任何实例,没有实例也可以访问。
     *      其初始化语句在任何静态成员使用之前调用
     *      
     *  静态函数成员:
     *      独立于任何实例,没有实例也可以调用
     *      不能访问实例成员,只能访问其他静态成员
     *      
     *  静态构造函数:
     *      可用于初始化静态字段
     *      在引用任何静态成员之前,和创建任何实例之前调用
     *      与类同名,使用static,无参数,无访问修饰符
     *      
     *  静态类:
     *      类只包含了静态的方法和属性,并标识为static
     *      不能创建实例,不能被继承
     *      可以为静态类定义一个静态构造函数
     *      用于基础类库(如数学库)或扩展方法
     *      
     *  扩展方法的要求
     *      扩展方法所属的类必须是static类
     *      扩展方法本身必须是static方法
     *      扩展方法的第一个参数类型,必须是this+类名
     *      
     *  装箱:浅拷贝
     *      根据值类型的值,在堆上创建一个完整的引用类型对象,并返回对象的引用,是一种隐式转换
     *      有时候需要将值类型转化为引用类型(例如object)来进行统一的操作(例如作为函数的参数)和统一的存储(例object[])
     *      在堆上创建引用类型的副本,新创建的引用类型和原本的值类型相互独立
     *      
     *  拆箱:
     *      将装箱后的对象转换成值类型的过程,是一种显示转换
     *      
     *  自定义转换:
     *      为自己的结构或类定义显示和隐式转换
     *  隐式转换:public static implicit operator Dog(Cat cat) 目标类型(原类型)
     *  显示转换:public static explicit operatir Dog(Cat cat)
     *  
     *  重载运算符:
     *      利用现有的某种运算符,针对自定义类或结构,定义某种运算符
     *      
     *  泛型类:class Cage<T>
     *      就是一个模子,装入类型的材料,可以塑造想要的产品
     *      易于维护,修改模板,所有的实例都会被改变
     *      只有需要的类型才会被实例化
     *      
     *  泛型方法:
     *      就是方法的模型,给定具体的类型,就可以实例化出一个操作该类型的具体方法
     *   
     *  泛型接口:
     *      允许我们将接口成员的参数和返回类型设置成为泛型参数的接口
     *      
     *  约束:
     *      缩小泛型参数的范围
     *      只有添加了约束,才能调用泛型参数中(比如T)的方法
     *      
     *  集合:
     *      动态数组:ArrayList  列表:List   字典:Dictionary    
     *      队列:Queue    栈:Stack
     *      
     *  动态数组 ArrayList:
     *      初始化可以不指定大小
     *      获取长度,使用Count属性
     *      添加Add,删除Remove,RemoveAt,访问[index]
     *      类型不安全,有装箱拆箱的性能问题,于是出现了List<T>
     *     
     *  字典 Dictionary<Tkey,Tvalue>:
     *      存储的是一系列的键值对
     *      数量 Count    添加 Add(key,value)   删除 Remove   访问 [key]
     *      
     *  栈 Stack:
     *      出栈 Pop    入栈 Push     获取栈顶元素 Peek
     *      
     *  队列 Queue:
     *      出队 Dequeue      入队 enqueue
     *      
     *  委托:
     *      持有一个或者多个方法的对象,并且该方法可以执行,传递
     *      
     *  声明委托方法:
     *      可以声明,是一种引用类型    delegate void ActCute();
     *      
     *  Lambda 表达式
     *      del = delegate(){} del = ()=>{}
     *      
     *  事件:
     *  发布者:通知事件发生的
     *  订阅者:对某件事情关注的
     *  事件触发:事件发生时,会通知所有关注该事件的订阅者
     *  注册:想要在事件发生时被通知,必须注册以表示关注
     */
    /*
    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("笼子已经装满了...");
            }
        }
        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 + "只狗");
        }

        // 隐式转换
        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("喂养一条狗");
        }
    }

    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("小白猫");
            // 强制转换
            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();
            */
        }
    }
}

运行结果

d1摇尾巴
C1看着你
Lambda表达式
小狗在说话:汪汪
小狗年龄是:1
小猫在说话:喵喵
小猫年龄是:1
小白狗在说话:汪汪
小白狗年龄是:1
小白猫在抓老鼠
小白猫在抓老鼠
小白猫在爬树
小白猫在爬树
一共有3只狗
喂养一条狗
i=3 ob=3
i=5 ob=6
j=6
比格在说话:汪汪
比格在说话:喵喵
宠物的名字是:比格
比格在说话:汪汪
笼子已经装满了...
狗的名字是:小狗一号
很开心看到
宠物的名字是:英短
坐下
狗的名字是:小黑
狗的名字是:小白
狗的名字是:A1
宠物的名字是:b
宠物的名字是:q1
有一条新的狗...
有一条新的狗...
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容