c#继承与多态使用示例

时间:2021-11-24 16:48:33 

继承和多态

派生类具有基类所有非私有数据和行为以及新类自己定义的所有其他数据或行为,即子类具有两个有效类型:子类的类型和它继承的基类的类型。

对象可以表示多个类型的能力称为多态性。

多态性示例


public class Parent
    {
        public Parent() { }
        public void MethodA()
        {
            Console.WriteLine("调用MethodA()");
        }
        public class Child:Parent
        {
            public Child() { }

            public void MethodB()
            {
                Console.WriteLine("调用MethodB()");
            }

        }
        class Test
        {

            static void Main(string[] args)
            {

                Parent oParent = new Parent();
                oParent.MethodA();//OK 调用类型Parent的成员方法
                //Child oChild1 = (Child)oParent;//运行错误
                Child oChild=new Child();
                oChild.MethodB();//OK 调用派生类Child的成员方法
                oChild.MethodA();//OK 调用基类Parent的成员方法
                Parent oParent1 =(Parent)oChild;
                oParent1.MethodA();
                //oParent1.MethodB();//编译出错,类型Parent不存在方法MethodB()
                Console.ReadLine();
                Child oChild1 = (Child)oParent1;
                oChild1.MethodB();//OK 调用派生类Child的成员方法
                oChild1.MethodA();//OK 调用基类Parent的成员方法
                Console.ReadKey();

            }
        }

    }

在上例中,类Child既有效的Child,又是有效的Parent。oChild可以作为类型Child,因而具有Child本身定义的方法MethodB()和基类Parent定义的方法MethodA();同时,对象oChild也可以强制转换为Child的基类Parent的对象oParent。强制转换不会更改oChild对象的内容,但oParent对象作为类型Parent,因而只具有类Parent定义的方法MethodA()。

将Child强制转换为Parent后,可以将该Parent重新强制转换为Child。并只有实际上是Child实例的那些实例才可以强制转换为Child,否则会产生运行错误:无法将类型为Parent的对象强制转换为类型Child。

继承的类型

C#包含两种继承类型:实现继承和接口继承。

现继承表示一个类型派生于一个基类型,派生类具有基类的所有非私有(非Private)数据和行为。在实现继承中,派生类型的每一个方法采用基类型的实现代码,除非在派生类的定义中指定重写该方法的实现代码。实现继承一般用于增加现有类型的功能,或许多相关的类型共享一组重要的公共功能场合。

接口继承表示一个类型实现若干接口,接口仅包含方法的签名,故接口继承不继承任何实现代码。接口继承一般用于指定该类型具有某类可用的特性,例如,如果指定类型从接口System.IDisposable中派生,并在该类中实现IDisposable接口的清理资源的方法Dispose(),则可以通过工通的机制调用该方法以清理资源。由于清理资源的方式特定于不同的类型,故在接口中定义通用的实现代码是没有意义的,接口即契约,类型派生于接口,即保证该类提供该接口规定的功能。

标签:继承与多态
0
投稿

猜你喜欢

  • Flutter 容器盒子模型的使用示例

    2023-06-18 18:47:43
  • Java线程池高频面试题总结

    2023-10-22 02:12:34
  • java内部类原理与用法详解

    2022-12-04 14:41:25
  • java后台接收app上传的图片的示例代码

    2022-11-03 00:04:15
  • Java实现年兽大作战游戏详解

    2023-11-08 04:28:05
  • Java 抽象类特点总结

    2023-07-28 10:39:46
  • springboot使用之多个filter的执行顺序以及配置方式

    2023-11-09 09:30:59
  • maven依赖版本没有按照最短路径原则生效的解决方案

    2023-04-04 20:49:09
  • 在java中ArrayList集合底层的扩容原理

    2023-12-19 11:12:15
  • 对比Java中的Comparable排序接口和Comparator比较器接口

    2023-10-29 04:29:51
  • MyBatis批量查询、插入、更新、删除的实现示例

    2021-07-21 22:33:16
  • 简单谈谈java自定义注解

    2021-07-21 18:40:53
  • IntelliJ IDEA 2017.1.4 x64配置步骤(介绍)

    2022-02-25 13:48:48
  • Java面向对象实现汽车租赁系统

    2023-05-20 07:03:06
  • java自定义封装StringUtils常用工具类

    2022-09-01 05:11:13
  • Maven入门之使用Nexus搭建Maven私服及上传下载jar包

    2022-05-06 20:47:43
  • 解析C#中委托的同步调用与异步调用(实例详解)

    2022-12-24 19:06:47
  • Java7和Java8中的ConcurrentHashMap原理解析

    2022-06-09 22:06:28
  • Spring Bean常用依赖注入方式详解

    2022-06-05 21:43:33
  • Java Hutool工具实现验证码生成及Excel文件的导入和导出

    2023-02-04 22:49:32
  • asp之家 软件编程 m.aspxhome.com