首页 > 代码库 > 面向对象(2)

面向对象(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    }