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

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 9472|回复: 3

[C#入门] 苏飞普通会员与高级会员的动作传承-基类与派生类函数的关系

[复制链接]
发表于 2015-6-7 11:53:35 | 显示全部楼层 |阅读模式
派生类继承了基类的所有变量成员,那么这些继承来的成员是如何初始化的呢?是先初始化基类变量还是初始化派生类变量,这些机制是如何发生的呢?我们还是以苏飞会员为例讲讲如何初始化成员变量的。
我们先在Sufei.cs基类中一个添加一个普通会员构造函数和析构函数。
[C#] 纯文本查看 复制代码
  class Sufei
    {
        //变量成员 
        public string name;
        private  int age;
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                if (value <= 0)
                    age = 0;
                else
                    age = value;
            }
        }
    
            private int count = 0; //用来记录积分

            //构造函数
           
            public Sufei()
            {
                Console.WriteLine("你好,你是普通会员");
            }
        //析构函数
            ~Sufei()
            {
                Console.WriteLine("你好,普通会员退出登录。");
            }

再在派生类SufeiSenior.cs中添加一个高级会员的构造和析构函数。
[C#] 纯文本查看 复制代码
  class SufeiSenior:Sufei //苏菲基类派生出高级会员
    {
        
        //私有成员
        private int moneyValue = 0;//高级会员有钱
        private int powerValue  = 0;//有钱任性
        //构造函数
        public SufeiSenior()
        {
            Console.WriteLine("你好,你是高级会员。");
            moneyValue++;
                Console.WriteLine("我的会员金钱为:{0}",moneyValue );
                powerValue++;
                Console.WriteLine("我的会员等级为:{0}",powerValue);

        }
        ~SufeiSenior()
        {
            Console.WriteLine("你好,高级会员退出登录。");
        }
        //属性:moneyValue
        public int MoneyValue
        {
            get
            {
                return moneyValue;
            }
            set
            {
                if (value <= 0)
                    moneyValue = 0;
                else
                    moneyValue = value;
            }
        }

        //属性:powerValue
        public int PowerValue
        {
            get
            {
                return powerValue;
            }
            set
            {
                if (value <= 0)
                    powerValue = 0;
                else
                    powerValue = value;
            }
        }

    }
}

再在主程序中运行,看看结果:
[C#] 纯文本查看 复制代码
 class Program
    {
        static void Main(string[] args)
        {
            //申明高级会员对象wwwconsumer
            SufeiSenior wwwconsumer = new SufeiSenior();
}


派生类函数的运行

派生类函数的运行

看到了吗?就是在运行派生类函数时,先运行基类函数,初始化基类变量,在运行派生类函数,初始化派生类变量;在删除对象时,先运行派生类函数,销毁派生类对象,在运行基类函数,销毁基类变量。对了,好像穿衣服,先穿里面,再穿外面;脱衣服时,先脱外面,再脱里面。这个里面是指基类,外面是指派生类。这样就很好理解基类与派生类的运行关系了。



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2015-6-7 12:25:08 | 显示全部楼层
你注意到了吗?同样是登录,普通会员和高级会员的登录是不同的,普通会员的登录就是提示普通会员登录,高级会员提示是高级会员登录(这是我杜撰的,实际上这个论坛的登录是一视同仁的,不要误会)。遇到这种情况,我们可以在基类中设计一个虚函数,用关键字virtual声明虚函数。
[C#] 纯文本查看 复制代码
 class Sufei
    {
        //变量成员 
        public string name;
        private  int age;
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                if (value <= 0)
                    age = 0;
                else
                    age = value;
            }
        }
    
            private int count = 0; //用来记录积分

           
            //函数:登陆
            public virtual  void Hello()
            {
                Console.Write("嗨,我是{0},我今年{1}岁了。", name,age);
                Console.WriteLine("欢迎你登录");
            }
}

再在派生类函数中用关键字overide重写基类的虚函数。
[C#] 纯文本查看 复制代码
  class SufeiSenior:Sufei //苏菲基类派生出高级会员
    {
        
        //私有成员
        private int moneyValue = 0;//高级会员有钱
        private int powerValue  = 0;//有钱任性
        //重写虚函数
        public override void Hello()
        {
            Console.Write("嗨,我是{0},我今年{1}岁了。", name, Age);
            Console.WriteLine("欢迎您,尊贵的高级会员");
        }
        //构造函数
        public SufeiSenior()
        {
            moneyValue++;
                Console.WriteLine("我的会员金钱为:{0}",moneyValue );
                powerValue++;
                Console.WriteLine("我的会员等级为:{0}",powerValue);

        }
      
        //属性:moneyValue
        public int MoneyValue
        {
            get
            {
                return moneyValue;
            }
            set
            {
                if (value <= 0)
                    moneyValue = 0;
                else
                    moneyValue = value;
            }
        }

        //属性:powerValue
        public int PowerValue
        {
            get
            {
                return powerValue;
            }
            set
            {
                if (value <= 0)
                    powerValue = 0;
                else
                    powerValue = value;
            }
        }

    }
}

这样,我们有了两个Hello()函数,当对象属于普通会员时,程序会自动调用基类的Hello()函数,当对象属于高级会员时,程序会自动调用派生类的Hello()函数,这样,就显示出普通会员与高级会员登录的不同了。
主程序中代码如下:
[C#] 纯文本查看 复制代码
 class Program
    {
        static void Main(string[] args)
        {//申明普通会员对象xiaomao
            Sufei xiaomao = new Sufei();
            xiaomao.Age = 26;
            xiaomao.name = "xiaomao";
            //申明高级会员对象wwwconsumer
            SufeiSenior wwwconsumer = new SufeiSenior();

            //访问派生类数据成员
           wwwconsumer.Age = 40;
           wwwconsumer.name = "wwwconsumer";
            //对象xiaomao引用基类中的函数Hello()
           xiaomao.Hello();
           //派生类的对象引用派生类中的函数Hello()
           wwwconsumer.Hello();
         }


运行结果如下:

虚函数的调用

虚函数的调用

看到了,xiaomao登录时调用的是基类函数,wwwconsumer登录时调用的派生类函数。
发表于 2015-6-8 10:37:24 | 显示全部楼层
恭喜你把名字改对了~~
 楼主| 发表于 2015-6-9 05:26:43 | 显示全部楼层
水手 发表于 2015-6-8 10:37
恭喜你把名字改对了~~

谢谢,我把站长的大名都搞错了,自认罚帖子100.帮我监督吧。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-3-29 18:31

© 2014-2021

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