面向对象(2)

访问级别约束

访问级别约束:子类访问级别不能比父类高(等级观念),因为子类能够出席的场合父类都应该能出席,如果父类可访问级别比子类低就有了父类去不了的场合(儿子能去的地方爹一定要能去)。举例;方法、属性等暴露的返回值、参数的数据类型不能比方法、属性或者所在类的可访问级别低,因为这些方法、属性要能在高级场合出现,如果用到的类型却不能在这个场合出现就明显不合理了。

多态

先看看ToString()方法 多态就是指不同对象收到相同消息时,会产生不同行为,同一个类在不同的场合下表现出不同的行为特征

里氏替换原则

父类引用指向子类对象

父类对象不能够替换子类

is-a 关键字as is

怎么实现多态1-抽象类abstract

什么是抽象类

不能被实例化的类(不能new)

抽象类的特点

见备注

案例1:计算形状Shape(圆circle,矩形Square ,正方形rectangle)的面积、周长

案例2:动物animal   都有吃eat和叫bark的方法,狗dog和猫cat叫的方法不一样

练习:都要具有SayHello和起立standup两个方法学生类和老师类中抽象出父类(person),并让学生和老师

做网站的公司(抽象类)  你给我活我去开发网站,但是网站需要一部分flash,我公司力都是程序员(抽象类中有实现的方法)。没人会做flash(抽象方法),于是我把做flash这部分工作给其它公司去做(重写抽象方法的类)

抽象类为子类提供所需要的成员
抽象类定义的是公共的实现和能力
抽象类中的成员既可以有实现也可以无实现
抽象类必须由其子类实现它的抽象成员(除非子类也是抽象类)
抽象类不能被实例化
一个类只能继承一个抽象类(类的单根继承性)

抽象方法(成员)不能有实现,必须被子类重写override(除非子类也是抽象类)
抽象方法(成员)的只能出现在抽象类中。


多态性的含义:使得能够利用基类的指针来引用不同子类的对象,以及根据所引用对象的不同,以不同的方式执行相同的操作。
多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

面向对象计算器

使用面向对象的方式实现+、-、* 、/的计算器

1、找对象

2、抽象出父类,让子类都有计算能力

3、实现子类

4、造飞机的工厂

5、调用

怎么实现多态2-接口

接口是定义一种能力,规定子类能干什么和抽象类有些相似,解决类的单根继承。接口可以实现多继承

案例 动物-鸟-麻雀,鸵鸟,企鹅 鸟能飞鸵鸟,企鹅不能。。。你怎么办

练习:从学生,老师,校长类中抽象出人的类,学生和老师都有收作业的方法,但是校长不会收作业 子类继承抽象类,实现接口 接口中的成员必须不能有实现 接口中的成员不能有访问修饰符,隐式公开 接口中可以有属性、方法、索引器等,但不能有字段 接口中的所有程序必须被子类中全部实现

皮包公司(接口)。你给我活我有能力去开发网站,但是接到活以后我公司没人会做。于是我把他交给有能力去做的人(实现功能的类)
使用接口来实现对扩展开放,对修改关闭

子类继承抽象类,实现接口
接口中的成员必须不能有实现
接口中的成员不能有访问修饰符,隐式公开
接口中可以有属性、方法、索引器等,但不能有字段
接口中的所有程序必须被子类中全部实现


 static void Main(string[] args)
        {
            //ISpeakable p1 = new Dog();
            //p1.Speak();

            ISpeakable p2 = CreateChatter(-1);//接口的优点。不管返回的是什么类型对象,只要能Speak就行
            p2.Speak();//调用的不是ISpeakable接口的方法,而是p2指向的对象的Speak方法

            Console.ReadKey();
        }

        static ISpeakable CreateChatter(int i)
        {
            if (i < 0)
            {
                return new Dog();
            }
            else if (i == 0)
            {
                return new Cat();
            }
            else
            {
                return new Bird();
            }
        }
    }

    interface ISpeakable//接口定义的是一种能力。
    {
        void Speak();
        //面试题:接口中能定义什么?
        //接口中可以定义方法、属性、索引器。因为属性、索引器本质上也是方法。
        //接口中不能定义字段,因为字段是实现。
    }

    interface IFlyable
    {
        void Fly();
    }

    class Dog : ISpeakable
    {
        #region ISpeakable 成员

        public void Speak()
        {
            Console.WriteLine("我是狗狗!");
        }

        #endregion
    }

    class Cat : ISpeakable
    {
        #region ISpeakable 成员

        public void Speak()
        {
            Console.WriteLine("我是猫!");
        }

        #endregion
    }

    //一个类只能有一个父类
    //一个类可以实现多个接口。接口只能决定能干什么,怎么干由类来实现
    class Bird : ISpeakable, IFlyable
    {
        #region ISpeakable 成员

        public void Speak()
        {
            Console.WriteLine("我是鸟!");
        }

        #endregion

        #region IFlyable 成员

        public void Fly()
        {
            Console.WriteLine("灰呀灰!");
        }

        #endregion
    }
原文地址:https://www.cnblogs.com/fanhongshuo/p/3826177.html