zoukankan      html  css  js  c++  java
  • 8.2.3多态性 第8章 面向对象编程简介

    继承的一个结果是派生于基类的类在方法和属性上有一定的重叠,   【从同一个基类派生出来的多个子类在方法和属性上有重叠

    因此,可以使用相同的语法处理从同一个基类实例化的对象。

    例如,如果基类Animal有一个方法EatFood(),则从派生于它的类Cow和Chicken中调用这个方法,其语法是类似的:

    Cow myCow=new Cow();

    myCow.EatFood();

    Chicken myChicken=new Chicken();

    myChicken.EatFood();

    多态则更推进了一步。可以把某个基本类型的变量赋予其派生类型的变量,例如:   【将子类赋给基类

    Animal myAnimal=myCow;

    不需要进行强制类型转换,就可以通过这个变量调用基类的方法:

    myAnimal.EatFood();//调用基类的方法,输出结果是调用派生类方法中的执行代码

    结果是调用派生类中的EatFood()执行代码。

    注意,不能以相同的方式调用派生类上定义的方法,下面的代码不能运行:

    myAnimal.Moo();  //myAnimal.Moo();//不能直接调用派生类的方法

    但是可以把基本类型的变量转换为派生类变量,调用派生类的方法,如下所示

    Cow myNewCow=(Cow)myAnimal;//将基类变量转换为派生类变量,就可以调用派生类的方法

    myNewCow.Moo();

    如果原始变量的类型不是Cow或派生于Cow的类型,这个强制类型转换就会产生一个异常。有许多方式说明对象的类型是什么,详见下一章。

    在派生于同一个类的不同对象上执行任务时,多态性是一种极为有效的技巧,其使用的代码最少。

    注意,并不是只有共享同一个父类的类才能利用多态性。只要子类和孙子类在继承层次结构中有一个相同的类,它们就可以用相同的方式利用多态性。

    还要注意,在C#中,所有的类都派生于同一个类object,object是继承层次结构中的根。

    所以,可以把所有的对象看作是类object的实例。这就是在建立字符串时,Console.WriteLine()可以处理无数多种参数组合的原因。第一个参数后面的每个参数都可以看作一个object的实例,所以可以把任何对象的输出结果写到屏幕上。为此,需要调用方法ToString()(object的一个成员),我们可以重写这个方法,为自己的类提供合适的执行代码,或者使用默认的执行代码,返回类名(根据它所在的namespace,返回类的修饰名)

    接口的多态性

    前面介绍的接口概念是组合相关的属性和方法。http://www.cnblogs.com/chucklu/p/4049179.html

    尽管不能像对象那样实例化接口,但可以建立接口类型的变量,然后就可以在支持该接口的对象上,使用这个变量访问该接口提供的方法和属性。

    例如,假定不使用基类Animal提供EatFood()方法,而是把该方法放在接口IConsume上。Cow和Chicken类也支持这个接口,唯一的区别是它们必须提供EatFood()方法的执行代码(因为接口不包含执行代码),接着就可以使用下属代码访问该方法了:

    //consume单词是消耗的意思

                Cow myCow = new Cow();
                Chicken myChicken = new Chicken();
                IConsume consumeInterface;
                consumeInterface = myCow;
                consumeInterface.EatFood();
                consumeInterface = myChicken;
                consumeInterface.EatFood();

    这就提供了以相同方式访问多个对象的方式,且不依赖于一个公共的基类。在这段代码中,调用

    consumeInterface.EatFood();
    的结果是调用Cow和Chicken类的方法,这取决于哪个实例被赋予了接口类型的变量。

    需要注意的是:派生类会继承其基类的接口。在上面的示例中,要么是Animal支持IConsume,要么是Cow和Chicken支持IConsume。

    有共同基类的类不一定有共同的接口,反之亦然。

  • 相关阅读:
    迭代模型
    螺旋模型
    瀑布模型
    V模型
    codeforces411div.2
    专题1:记忆化搜索/DAG问题/基础动态规划
    Python
    字符串的相关操作方法
    Python基本数据类型
    编码
  • 原文地址:https://www.cnblogs.com/chucklu/p/4079934.html
Copyright © 2011-2022 走看看