http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 10551|回复: 6

[C#入门] 苏飞普通会员高级会员其实都是猿-谈面向对象编程的多态性思维

[复制链接]
发表于 2015-6-9 05:55:24 | 显示全部楼层 |阅读模式
本帖最后由 wwwconsumer 于 2015-6-9 05:57 编辑

笔者正在学习编程中的多态性的思想。我在去年这个时候就在学习编程的思想-多态性。但百撕不得姐, 哥我就放弃了 。其实,多态性在现实中是有很多例子的:我们这个论坛中的会员,不论是普通会员还是高级会员,其实他们就是一个屌丝-程序猿:@ !所以,这员那员,其实就是个猿,这个猿,即表示普通会员,也可以慨括高级会员。你在论坛里大喊一嗓子:苦逼的程序猿,你出来!不管是普通会员还是高级会员,都会泪流满面地爬出来:苦逼的楼主,我们都是苦逼猿 !在编程中,你也可以只用一个基类的引用符,可以指向多种派生类对象,具有多种不同的形态,这种现象就是类的多态性(Polymorphism)。
说到引用符,我们初学者还不太好理解。那我就从最简单的变量讲起吧,我们在刚学编程时,就知道可以用一个符号表示变量,其实同一个符号,还可以在程序中赋予不同的值呢。下面我上一个例子。
[C#] 纯文本查看 复制代码
{
    class Program
    {
        static void  A()
        {
            int x =10;
            Console.WriteLine("The variable x in A() is {0}",x);
        }
        static void  B()
        {
            int x =20;
            Console.WriteLine("The variable x in B() is {0}",x); 
        }
       
        static void Main(string[] args)
        {
            int x = 30;
            A();//调用函数A();输出A()中的X;
            B();//调用函数B();输出B()中的X;
            Console.WriteLine("The variable x in Main() is {0}",x);

        }
    }
}

再在主程序中运行,看看是什么情况?

一个变量赋予多个值

一个变量赋予多个值

在函数A()、B()和Main()中都定义了变量X,但他们可以赋予不同的值,实际上变量只是一个命名符号,在编译阶段,都会转化为数字编码。这个同一变量赋予不同的值的例子,就有点多态性的思想萌芽了。


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2015-6-9 06:30:51 | 显示全部楼层
这事你姐知道吗?
 楼主| 发表于 2015-6-9 07:03:07 | 显示全部楼层
本帖最后由 wwwconsumer 于 2015-6-9 07:04 编辑

我们可以假设一个小区,有很多房子,这些房子,都有不同的编号。然后在辖区门口,设立了与房间号相对应的邮箱。邮递员送信的话,直接送到邮箱中,房主就会取到自己的信件了。编程也是一样,邮箱相当于引用符,房间相当于对象。当你使用引用符时,程序就根据引用符找到相应的对象了。当然,前提是邮箱和房间都是存在的。在类中,创建成员对象的运算符是new,只有new之后,我们就把引用符和对象绑定在一起了。例如:
[C#] 纯文本查看 复制代码
   Sufei xiaomao = new Sufei();

这样,引用符xiaomao指向了具体的普通类sufei中的一个会员xiaomao,他有姓名、年龄等属性了。这好比301房间的邮箱一样,找到301邮箱,你就可以送信到301房间了。在这里301这个引用符,既是301房间,也指301邮箱,我们一般没必要将两者区分清楚。但是,假如邮递员接到命令要把一批广告送到三楼以上的用户,这时,你就要按照“三楼以上”这个定义将广告送到具体的一个个三楼的邮箱中。这个“三楼以上”就是一个引用符,而一个个邮箱就是你要投递的具体的对象。这便出现一个有趣的现象,一个引用符,可以指向不同的 对象,就好像上边的例子:一个变量符号,可以赋予不同的值。这就是多态性。
 楼主| 发表于 2015-6-11 05:02:31 | 显示全部楼层
本帖最后由 wwwconsumer 于 2015-6-12 05:10 编辑

下面我将举一个引用符指向多个对象的例子来讲程序多态性。
我们先创造一个基类普通会员Sufei的类:
[C#] 纯文本查看 复制代码
 class Sufei
    {
        //变量成员 
        public string name;
        private  int age;
        public int Age
}

然后再创造一个继承普通会员基类Sufei的高级会员SufeiSenior:
[C#] 纯文本查看 复制代码
  public SufeiSenior()
        {
            moneyValue++;
                Console.WriteLine("我的会员金钱为:{0}",moneyValue );
                powerValue++;
                Console.WriteLine("我的会员等级为:{0}",powerValue);

        }
      然后再主程序中输入下列代码
[C#] 纯文本查看 复制代码
static void Main(string[] args)
        {//申明类型为普通会员Sufei的引用符
            Sufei someone;
            //申明普通会员对象xiaomao
            Sufei xiaomao = new Sufei();
            xiaomao.Age = 26;
            xiaomao.name = "xiaomao";
            //申明高级会员对象wwwconsumer
            SufeiSenior wwwconsumer = new SufeiSenior();

            //访问派生类数据成员
           wwwconsumer.Age = 40;
           wwwconsumer.name = "wwwconsumer";
            //让引用符指向xiaomao
           someone = xiaomao;
           Console.WriteLine("嗨,我是{0},我有{1}岁了。",someone .name ,someone .Age);
            //让引用符指向对象wwwconsumer
           someone = wwwconsumer;
           Console.WriteLine("嗨,我是{0},我有{1}岁了。",someone .name ,someone .Age );
}

运行结果:

同一引用符指向不同的对象

同一引用符指向不同的对象

看到了吗?同一引用符someone先后指向了普通会员xiaomao和高级会员wwwcosumer,而且指向普通会员时引用的普通会员的默认构造函数,没有任何提示;指向高级会员时引用了高级会员的构造函数,高级会员的构造函数中默认有提示金钱、等级等属性,故在运行中就将高级会员的这些属性显示出来了。
 楼主| 发表于 2015-6-11 07:56:17 | 显示全部楼层
下面我们应用多态性实现对苏飞会员登录的通用调用程序:
我们先创建一个Sufei.cs的类,里面有Sufei基类和OrdinarySufei(普通会员)、SufeiSeniro(高级会员)派生类,而普通会员(OrdinarySufei)又分为一级普通会员(FirstOrdinarySufei)、二级普通会员(SecondOrdinarySufei)、三级普通会员(ThirdOrdinarySufei)三个派生类;高级会员(SufeiSeniro)也分为一级高级会员( FirstSufeiSenior),二级高级会员(SecondSufeiSenior)、三级高级会员(ThirdSufeiSenior)三个派生类。具体编码如下:
[C#] 纯文本查看 复制代码
namespace SufeiII
{
    //苏飞会员
    abstract class Sufei
    {
        //抽象函数:登录
        public abstract void Hello();
    }
    //苏飞普通会员
    class OrdinarySufei : Sufei
    {
        //重写函数:登录
        public override void Hello()
        {
           throw new NotImplementedException();
        }
    }

    //高级会员
    class SufeiSenior : Sufei
    {
        //重写函数:登录
        public override void Hello()
        {
        }
    }
    //普通会员一级
    class FirstOrdinarySufei : OrdinarySufei
    {
        public override void Hello()
        {
            Console.WriteLine("你好,欢迎一级普通会员登录!");
           
        }
    }
        //普通会员二级
        class SecondOrdinarySufei : OrdinarySufei
        {
            public override void Hello()
            {
                Console.WriteLine("你好,欢迎二级普通会员登录!");
             
            }
        }

            //普通会员三级
            class ThirdOrdinarySufei : OrdinarySufei
            {
                public override void Hello()
                {
                    Console.WriteLine("你好,欢迎三级普通会员登录!");
                    //throw new NotImplementedException();
                }

            }
            //高级会员一级
            class FirstSufeiSenior : SufeiSenior
            {
                public override void Hello()
                {
                    Console.WriteLine("你好,欢迎一级高级会员登录!");
                }
            }
            //高级会员二级
            class SecondSufeiSenior : SufeiSenior
            {
                public override void Hello()
                {
                    Console.WriteLine("你好,欢迎二级高级会员登录!");
                }
            }
            //高级会员三级
            class ThirdSufeiSenior : SufeiSenior
            {
                public override void Hello()
                {
                    Console.WriteLine("你好,欢迎三级高级会员登录!");
                }
            }
        }
 

然后我们在主程序中实现通用登录程序:
[C#] 纯文本查看 复制代码
 static void Main(string[] args)
        {
            //申明一个基类[Sufei类]的引用字符
            Sufei[] members = new Sufei[6];
            //让每个引用符指向一个派生类的对象
            members[0] = new FirstOrdinarySufei();
            members[1] = new SecondOrdinarySufei();
            members[2] = new ThirdOrdinarySufei();
            members [3]=new FirstSufeiSenior();
            members [4]=new SecondSufeiSenior();
            members [5]=new ThirdSufeiSenior();
            //通用处理
            foreach (Sufei someone in members)
            {
                someone.Hello();//不论对象是那种会员,都出现登录的情形
            }

        }
    }
}

运行结果如下:

派生类通用程序编程

派生类通用程序编程
发表于 2015-6-11 13:43:18 | 显示全部楼层
我只是路过打酱油的。
 楼主| 发表于 2015-6-12 05:23:20 | 显示全部楼层
继承和多态性是开发复杂软件的关键技术,特别适合于分层软件系统。比如,苏飞论坛里的网络爬虫类软件可以看做是继承C#httphelpers基类基础上的派生类软件,而这个软件如果再融入多态性的概念,可以开发出适应不同页面、不同登录要求的网页爬虫环境,开发者可以设计一个抽象基类,提供进入相应页面和读取信息储存两个函数即可,不用关心页面是利用什么机制进入的,爬取的信息是如何解码的。操作者只要输入网址和要保存的方式和位置后,其他的程序有机器帮你执行了。你看,继承和多态性就是这么神奇!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-3-29 07:39

© 2014-2021

快速回复 返回顶部 返回列表