zoukankan      html  css  js  c++  java
  • C#语言使用多态(接口与override) ——帮您剔除对面向对象多态性的疑惑

    多态是面向对象编程中三大机制之一,其原理建立在"从父类继承而来的子类可以转换为其父类"这个规则之上,换句话说,能用父类的地方,就能用该类的子类.当从父类派生了很多子类时,由于每个子类都有其不同的代码实现,所以当用父类来引用这些子类时,同样的操作而可以表现出不同的操作结果,这就是所谓的多态.

    ● 编译时的多态性
      编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。

    ● 运行时的多态性
      运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现或者接口。

    编译时多态即函数重载,我这里不多说了以下主要是通过override和Interface实现的多态。

    一、Override。首先来创建三个类,一个是父类Base,其他两个是继承于Base的A类和B类,代码如下

    View Code
        class Base
        {
            public virtual void Method()
            {
                Console.WriteLine("我是父类的虚方法");
            }
        }
    
        class A : Base
        {
            public override void Method()
            {
                Console.WriteLine("我是A类的重写父类方法");
            }
        }
    
        class B : Base
        {
            public override void Method()
            {
                Console.WriteLine("我是B类的重写父类方法");
            }
        }

    然后在Main方法里面去调用它们

    View Code
        class Program
        {
            static void Main(string[] args)
            {
                overrideDemo();
            }
    
            static void overrideDemo()
            {
                //创建一个父类的数组
                Base[] bases = new Base[] { new A(), new B() };
                foreach(var item in bases)
                {
                    item.Method();
                }
            }
        }

    运行结果如下

    发现父类的Method方法根本就没有运行,也就是数组虽然是Base类型,但是他们分别是A类和B类的实例,而这两个类对Method方法进行了override,因而执行的是他们重写的函数,而接口也是类似的,不同的是我们不需要override关键字。

    View Code
    public interface IBase
        {
            void Method();
        }
    
        public class C : IBase
        {
            public void Method()
            {
                Console.WriteLine("我是C类实现接口的方法");
            }
        }
    
        public class D : IBase
        {
            public void Method()
            {
                Console.WriteLine("我是D类实现接口的方法");
            }
        }

    调用示例:

    View Code
            static void Main(string[] args)
            {
                interfaceDemo();
            }
    
            static void interfaceDemo()
            {
                //创建一个接口的数组
                IBase[] bases = new IBase[] { new C(), new D() };
                foreach (var item in bases)
                {
                    item.Method();
                }
            }

    运行结果和上面的类似,虽然类型相同,但是是谁的实例就调用谁的方法,彼此独立。

    多态的运用场景很多,特别是在设计模式当中,几乎是离不开多态,但是并不是说继承就很棒,如果我们的程序有很深的继承层次,将会提高耦合度,程序则变得复杂。我们使用多态的思想就是,抽象他们的共同点,不去考虑他们的具体实现。

    理论的东西我就不罗嗦了,这里给一个实际当中使用的例子

    http://www.cnblogs.com/FreeDong/archive/2012/08/11/2627198.html



     感谢阅读,请留下您的意见或疑问! 能力有限,错漏难免,欢迎指点!

     分割线:我的个人原创,请认准 http://freedong.cnblogs.com/ (转摘不标原文出处可耻)

  • 相关阅读:
    UART中的硬件流控RTS与CTS
    Yii smsto短信接口的函数
    分布式选主 利用Mysql ACID和Lease协议实现选主和高可用
    Extjs GridPanel 合计功能 解决滚动条滚动问题和页面刷新滚动条回到初始位置问题。
    基于ARM+LINUX的无线视频采集系统设计搭建嵌入式web服务器
    C++里父类的析构函数为什么声明为virtual
    重量过载 = 重载
    Spread Studio中文支持图解
    Android用户如何FQ访问被封锁的媒体资源
    将myeclipse 10.x以下版本web project的导入到myeclipse blue 2013 部署没有项目名
  • 原文地址:https://www.cnblogs.com/FreeDong/p/2626312.html
Copyright © 2011-2022 走看看