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

 更新时间:2015年01月20日 09:54:22   投稿:junjie  
这篇文章主要介绍了C#中面向对象编程机制之多态学习笔记,本文总结了个人对多态的理解以及接口多态、继承多态等内容,并给出了代码示例,需要的朋友可以参考下

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();
    }

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

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() { }
    }
 

  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();
    }

总结:

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

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

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

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

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

相关文章

  • C#对Access进行增删改查的完整示例

    C#对Access进行增删改查的完整示例

    本文主要是讲C#对Access数据库的增删改查操作,想学习C#和Access数据库操作基础的可以参考借鉴,以下代码都经过实践测试可用,下面跟着小编一起来看看。
    2016-08-08
  • c# 以类名为参创建父类相同的类的实例代码

    c# 以类名为参创建父类相同的类的实例代码

    下面小编就为大家带来一篇c# 以类名为参创建父类相同的类的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C#中获取二维数组的行数和列数以及多维数组各个维度的长度

    C#中获取二维数组的行数和列数以及多维数组各个维度的长度

    这篇文章介绍了C#中获取二维数组的行数和列数以及多维数组各个维度的长度,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Unity实现微信聊天框界面

    Unity实现微信聊天框界面

    这篇文章主要为大家详细介绍了Unity实现微信聊天框界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • .Net笔记:System.IO之Stream的使用详解

    .Net笔记:System.IO之Stream的使用详解

    本篇文章是对.Net中System.IO之Stream的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#实现贪吃蛇小游戏

    C#实现贪吃蛇小游戏

    这篇文章主要为大家详细介绍了C#实现贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C#使用Socket进行简单的通讯的示例代码

    C#使用Socket进行简单的通讯的示例代码

    Socket 类是基于与 Linux、macOS 或 Windows 的本机互操作性提供的托管代码版本的套接字服务,提供了一系列的接口来支持应用层的调用,下面我们就来学习一下如何使用Socket进行简单的通讯,需要的可以参考下
    2023-12-12
  • 如何使用C#串口通讯实现数据的发送和接收

    如何使用C#串口通讯实现数据的发送和接收

    本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣的朋友一起看看吧
    2025-03-03
  • C#实现简单俄罗斯方块

    C#实现简单俄罗斯方块

    这篇文章主要为大家详细介绍了C#实现简单俄罗斯方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C# System.Linq提供类似SQL语法的高效查询操作

    C# System.Linq提供类似SQL语法的高效查询操作

    System.Linq是C#的一个命名空间,提供了LINQ(语言集成查询)功能,允许开发者使用一致的查询语法来处理不同类型的数据源,如数组、集合、数据库和XML等,本文介绍C# System.Linq提供类似SQL语法的高效查询操作,感兴趣的朋友一起看看吧
    2024-09-09

最新评论