我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:六合图库 > 多态逻辑 >

C基础--继承与多态

归档日期:05-02       文本归类:多态逻辑      文章编辑:爱尚语录

  继承:指一个对象延续另一个对象的特征(属性和方法),并且有自己的个性特征(属性和方法)。

  必要性:代码复用,避免重复;一处更新,处处更新。与封装不同的是,封装主要是封装一个方法、一个类,使用时直接调用不能更改;继承主要讲需要的属性和方法(主要是方法)进行“封装”,且要使用时还可以继续扩展自己的特性(继续增加、修改方法--方法重写)。

  使用广泛:C#里,Object类是所有类的基类,winform里面所有控件都继承于Control类。

  父类与子类:当A继承于B时,A是子类(或叫派生类),B是父类(或叫基类或超类)。

  Program里面不需要修改,我们可以一样得到上面的结果,这就是使用继承的好处。

  刚刚是使用对象初始化器来实现属性的赋值的,下面使用构造函数来赋值的例子,介绍this、base关键字的使用。

  这里使用了base关键字,该关键字除了可以调用父类的构造方法,还可以调用父类的属性和方法,使用关键字base能将逻辑变得清晰,this关键字则是表示自己类里面的属性和方法,与base做区分。

  protected关键字限制了父类的某个成员只能被其子类访问,但是如果在父类里面使用public去调用protected,依旧是可以访问带protected的成员,但是给带protected的属性赋值只能通过构造函数的方式。

  我们回头看看会发现,刚刚我们解决的是属性代码重复的问题,如果现在方法代码也重复怎么办?先举例说明!

  is : 检查对象是否与指定类型兼容,不兼容则返回false;as:用于在兼容的引用类型之间执行转换,失败则返回null 。

  父类是完全包含于子类的,因此用父类创建的list,可以放子类类型成员进去,但放进去后会被转换为父类类型成员,因此在取出时需要再进行转换。

  而且这不符合“开-闭原则”---开发扩展,封闭修改。就是应该要尽可能少的去修改源代码,这里很明显,当子类再增加的时候,需要再去加判断才行。

  这里使用抽象方法对以上问题进行优化,关键字:abstract, override。

  抽象类:使用abstract修饰的类,抽象类可以没有抽象方法,但抽象方法不能没有抽象类。抽象类不能创建实例对象。Animal a=new Animal();是错的,Animal c=new Cat();是对的。抽象类不能是静态的或密封的。

  抽象方法:即在父类定义一个方法,但不去实现,在子类实现或重写(若在子类重写,需要在子类的子类实现,以此类推)。定义抽象方法使用关键字abstract,当一个类中有一个抽象方法时,需要在类的前面也加上abstract关键字;子类在方法重写时加上override关键字。

  不再需要判断、转换,虚拟机会在运行时自动判断当前成员类型,再去调用相应子类的重写方法。

  这里面我们在父类定义Have方法的时候使用的是抽象方法---abstract,在父类是不能对抽象方法进行编写的;还有一种可能,就是我们可以在父类对该方法进行实现,子类可以自行选择是重写该方法,还是直接使用父类的默认方法,这加强了灵活性,这就是虚方法---virtual,单纯使用虚方法的时候该类不需要再写上abstract(测试环境:VS2015,4.5),但是如果该类里面有其他抽象方法还是要写abstract关键字的。

  虚方法使用很广泛,系统自带的虚方法比如:Equals,ToString等。Equals()默认是对两个值的引用地址进行比较,如果不一致则返回false;如果我们想让他对引用类型的变量的值进行比较,就应该重写该方法。比如:

  补充一下:虚方法是通过override去对父类方法重写实现,实际上我们还是可以通过base.虚方法()这样的方式去调用父类的方法的;这里介绍一个方法覆盖,使用new关键字,比如上面父类Animal里面有一个Introduce方法:

  当Cat对象再次去调用Introduce这个方法时,只能使用新方法,不能再去实现父类方法了。

  在上面我们通过抽象类抽象方法(或虚方法)实现了不同的对象去调用同样一个方法时,产生不同的行为,这就是“继承多态”,就是多态的一种,还有一个就是“接口多态”,与此类似,不过是通过接口实现的而不是继承。

  多态概念:不同对象,接受相同的信息,产生不同的行为,称为多态。多态有虚拟机自行决定,它会根据子类的原始类型,自动调用该对象使用override重写后的方法,利于程序扩展。

  可以将父类类型作为方法参数,但是传递的是子类类型,这就是里氏替换原则(LSP):

本文链接:http://lcvam.com/duotailuoji/279.html

上一篇:构造器内的多态方法

下一篇:没有了