@什么是多态?

  

  同一操作,指的的是父类,派生类的方法签名一致。但是,不同类的(实例)执行结果不同,因为方法的实现不同。

 

  @面向对象的精髓就是写出的代码具有可复用性、可维护性和可扩展性,说白了就是写出的程序容易阅读,易于理解。

  其中

  1,  多态提供了可扩展性,代码简洁性,以及可以维护性。

  2,  继承提供了代码可复用性,可扩展性。

  3,  封装提供了安全性。封装的实现例如属性。

 

  @面向对象()的三大特征:封装,继承,多态。

      1,封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。 

  2,继承是为了重用父类代码,同时为实现多态性作准备。

  3,那么什么是多态呢?方法的重写、重载与动态连接构成多态性。

  抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。 

 

 

  @下边重点讲解多态

  首先,多态是一种概念,不是一种实现,所以没有关键字。为什么要方法重写?为什么要有抽象类?为什么方法重载?为了多态。用不同的派生类来实现基类的方法,用不同的派生类来实现接口的方法,从而达到不同的效果。都是多态的一种应用。

      ---常见的多态体现1,接口--interface;2,抽象类--abstract

  --------当派生类从基类继承时,它会获得基类的所有方法、字段、属性和事件。面向对象的语言使用虚方法表达多态。若要更改基类的数据和行为,您有两种选择:可以使用新的派生成员替换基成员,或者可以重写虚拟的基成员(override)。

  --------使用新的派生成员替换基类的成员需要使用 new 关键字。

  --------字段不能是虚拟的,只有方法、属性、事件和索引器才可以是虚拟的。

  --------注意:建议虚拟成员在它们自己的实现中使用 base 来调用该成员的基类实现。允许基类行为发生使得派生类能够集中精力实现特定于派生类的行为。未调用基类实现时,由派生类负责使它们的行为与基类的行为兼容。

 

  @多态的设计原则之一就是要依赖于抽象,而不依赖于具体,增加灵活性

  --------多态就是为了体现这一原则。

  --------常见的多态体现,如接口、抽象类等等。

 

  @要理解多态性,首先要知道什么是“向上转型”。 

  我定义了一个子类Dog,它继承了Animal类,那么后者就是前者是父类。

  我可以通过Dog c = new  Dog();实例化一个Dog的对象,这个不难理解。

  但当我这样定义时:Animal a = new Dog();这代表什么意思呢? 很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。

  将子类对象赋给父类的引用就是向上转型,Animal a2 = new Dog();中的new Dog()就是实例化一个没有名字的对象,然后转型给父类的引用a2,仅此而已。

  @重点:为什么要将父类的变量指向子类的对象?

  1,一般来说,一个对象实例创建完就定死了,比如dog,如果程序里的变量写dog的话,以后调用都要写dog,万一以后发生变化要改代码,那工作量很大。那么事先就不写死dog,而是写父类Animal,那么以后用到Animal的地方,用dog实例,cat实例都可以取代,不用改实例名了。说玄乎一点,也就体现了面向对象“多态”的特性。

  2,因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。 

 

  @动态连接

  所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;

  ---定义:对于父类中定义的方法,如果子类中重写了(override)该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接

 

  @对于多态,可以总结它为

  一、使用父类类型的引用指向子类的对象;

  二、该引用只能调用父类中定义的方法和变量(当Person b=new Chinese();时,父类Person型变量指向了子类Chinese的对象,此时b只能调用父类中定义的方法和变量。);

  三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(这叫动态连接、动态调用

  四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

 

  @C#多态定义,实现及简单例子

  ------继承是子类使用了父类的方法,多态是父类使用了子类的方法。

 

  @多态性定义同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。多态性通过派生类重载基类中的虚函数型方法来实现。

  ---虚方法注意:

  

  ---虚方法visual 和override重写应用实例:

  ----图1:

  

  ---总结:用方法重写,用一句语句,代替了注释掉了上边一堆代码,只需要在声明的基类和派生类的方法名的前加关键字virtual和override。

  ----图2:类的声明。及方法重写的声明。

   

  ---总结:输出结果如下:

  

  ---Virtual虚方法就是不调用的方法,调用的是override关键字的方法。

  图3:如果将图2改成下边后的输出结果(作用:子类调用基类的方法)

  

  ---实例1:用抽象类实现多态

  

  

  输出结果:

  

  ---实例2用接口实现多态

  

  

   

  ---最后输出结果:

    

posted on 2016-12-19 11:24  学到老死  阅读(234)  评论(0)    收藏  举报