• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#中面向对象编程机制之多态学习笔记

C#中面向对象编程机制之多态学习笔记

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了C#中面向对象编程机制之多态学习笔记等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

C#的多态性:

我的理解是:同一个操作,作用于不同的对象时,会有不同的结果,即同一个方法根据需要,作用于不同的对象时,会有不同的实现。

C#的多态包括:接口多态,继承多态。

其中继承多态又包括通过虚拟方法实现的多态和通过抽象方法实现的多态性

例如:基类动物都有吃的方法,但是不同的动物吃的东西就会不一样,例如狼吃肉,羊吃草,这样“吃”的这个方法就要在派生类里面重新实现以下,运行时,通过指向基类的指针,来调用实现派生类中的方法。

接下来举例实现多态性。

1. 接口多态性

把动物“吃”的方法放到一个接口(IAnimal)里,然后让具体的动物类(Wolf/Sheep)继承这个接口,并根据自己的需要实现这个接口。

代码实现:

class Program {
        static void Main(string[] args) {
            new Wolf().Eat();
            new Sheep().Eat();
        }
    }

    public class Wolf : IAnimal {
        //多态实现
        public void Eat() {
            Console.WriteLine("狼吃肉!");
        }
    }

    public class Sheep : IAnimal {
        //多态实现
        public void Eat() {
            Console.WriteLine("羊吃草!");
        }
    }

    //接口
    public interface IAnimal {
        void Eat();
    }
</div>

接口的多态性就是当不同的类继承了相同的接口以后,都要根据自己的需要重新实现继承的接口,这样同样的方法签名在不同的类中就会实现不同的操作。

2. 继承的多态性

2.1.通过虚拟方法实现的多态(virtual,override)

   首先要在基类中实现virtual方法,然后在派生类中根据自己的需要用override重写virtual方法。如果不希望这个方法被继续重写,则把这个方法写成sealed方法。

  virtual方法必须在基类中实现。

  代码实现:

    class Program {
        static void Main(string[] args) {
            new Wolf().Eat();
            new Sheep().Eat();
            new Goat().Eat();
        }
    }

    public class Wolf : Animal {
        //多态实现
        public override void Eat() {
            base.Eat();
            Console.WriteLine("狼吃肉!");
        }
    }

    public class Sheep : Animal {
        //多态实现
        public override void Eat() {
            base.Eat();
            Console.WriteLine("羊吃草!");
        }
    }

    public class Goat : Sheep {
        //多态实现被终结,此Eat方法不能被override,因为用sealed了
        public sealed override void Eat() {
            //base.Eat();
            Console.WriteLine("山羊吃草!");
        }
    }

    //基类实现虚方法
    public class Animal {
        public virtual void Eat() { }
    }
  </div>

  2.2.通过抽象方法实现的多态(abstract,override)

抽象方法必须定义在抽象类里。抽象类不能被创建实例。

基类中的抽象方法只能被声明,不需要实现,所以派生类中重写抽象方法的时候没有base方法。

代码实现如下:
class Program {
        static void Main(string[] args) {
            new Wolf().Eat();
            new Sheep().Eat();
            new Goat().Eat();
        }
    }

    public class Wolf : Animal {
        //多态实现
        public override void Eat() {
            Console.WriteLine("狼吃肉!");
        }
    }

    public class Sheep : Animal {
        //多态实现
        public override void Eat() {
            Console.WriteLine("羊吃草!");
        }
    }

    public class Goat : Sheep {
        //多态实现被终结,此Eat方法不能被override,因为用sealed了
        public sealed override void Eat() {
            Console.WriteLine("山羊吃草!");
        }
    }

    //基类只需声明方法
    public abstract class Animal {
        public abstract void Eat();
    }
</div>

总结:

1.虚方法重写的时候可以有base方法(base.Eat()),抽象方法重写的时候没有base方法,原因是:虚方法必须在基类中实现,抽象方法只在基类中声明,不需要实现。

2.派生类中可以 不重写虚方法的实现,但是派生类必须重写抽象方法的实现,原因同1.

3.包含虚方法的非抽象类可以被创建实例(对象),但是包含抽象方法的抽象类不能被创建实例。

4.继承接口的派生类必须实现接口的方法,因为接口也是只负责声明方法,不负责实现。

5.接口的多态性不需要用override重写方法。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28C#编写的Base64加密和解密类
  • 2017-05-28WinForm DataGridView控件隔行变色的小例子
  • 2017-05-28Windows系统中C#读写ini配置文件的程序代码示例分享
  • 2017-05-28c#判断输入的是不是数字的小例子
  • 2017-05-28C#中使用反射获取结构体实例及思路
  • 2017-05-28基于WebRequest.RegisterPrefix的使用详解
  • 2017-05-28C#实现获取设置IP地址小工具
  • 2017-05-28C#通过正则表达式实现提取网页中的图片
  • 2017-05-28C#实现Datatable排序的方法
  • 2017-05-28c# Base64编码和图片的互相转换代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#日期时间格式化小结
    • c#读取excel方法实例分析
    • C#如何自动识别文件的编码
    • DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)
    • C#时间戳基本用法实例分析
    • C#窗体编程不显示最小化、最大化、关闭按钮的方法
    • 游戏开发之随机概率的选择算法
    • 深入c# GDI+简单绘图的具体操作步骤(一)
    • 简单的观察者模式示例分享
    • C#6.0中10大新特性的应用和总结

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有