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

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 11435|回复: 6

[C#入门] 苏菲论坛的高级会员-对苏菲论坛类的继承

[复制链接]
发表于 2015-6-3 06:16:45 | 显示全部楼层 |阅读模式
创立了苏菲论坛基类会员后,我们可以创立一个苏菲论坛的高级会员类,当然这个高级会员是有基础会员发展而来的,所以,我们不必重新再创立一个高级会员代码,直接从苏菲论坛会员代码中扩充就行了,这个就是编程中的继承思想。这个思想是学好C#编程语言的重要基础。我们现实世界中,有很多程序员设计了优秀的代码,我们直接拿来使用扩充就行了,就好像苏菲写的基类代码,就是让我们拿来运用的。好了,我们在上次的苏菲论坛会员代码中,扩充一个高级会员代码吧。为了方便大家查找,我还是先上苏菲论坛基类代码吧。
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SufeiClass
{
    class Sufei
    {
        //变量成员 
        public string name;
        public int age;
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                if (value <= 0)
                    age = 0;
                else
                    age = value;
            }
        }
    
            private int count = 0; //用来记录积分

            //函数成员
            //函数:登陆
            private void Hello()
            {
                Console.Write("嗨,我是{0},我今年{1}岁了。", name,age);
            }

            //函数:写文章
            public void WriteAticle()
            {
                Hello();
                Console.WriteLine("你的帖子已经被录入精华,谢谢发言");
            }

            //函数:奖励积分
            public void JiangLi()
            {
                count++;
                Hello();
                Console.WriteLine("我已经积攒{0}积分!", count);
            }
        }
    }


看到吗,普遍会员有姓名、年龄、积分等基本属性,可以登录、写文章、获得奖励等行为。
那么,我们再扩展一下高级会员类,有金钱、等级属性,可以投票、发短信、上传附件等行为。代码如下:

[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SufeiClass
{
    class SufeiSenior:Sufei //苏菲基类派生出高级会员
    {
        //私有成员
        private int moneyValue = 0;//高级会员有钱
        private int powerValue  = 0;//有钱任性,赋予等级
        //构造函数
        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;
            }
        }
        public void vote()
        {
            Console.WriteLine("你好,你可以投票!");
        }
        public void send()
        {
            Console.WriteLine("你好,你可以发短信!");
        }
        public void upload()
        {
            Console.WriteLine("你好,你可以上传附件!");
        }
    
    }
}



好了,我们在主程序program.cs创造一个名叫wwwconsumer的高级会员对象,看看他有什么属性和动作吧。
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SufeiClass
{
    class Program
    {
        static void Main(string[] args)
        {//申明对象wwwconsumer
            SufeiSenior wwwconsumer = new SufeiSenior();
            //访问基类数据成员
            wwwconsumer.age = 40;
            wwwconsumer.name = "wwwconsumer";
         
            //访问基类成员
            wwwconsumer.WriteAticle();
            wwwconsumer.JiangLi();
            wwwconsumer.JiangLi();
            //访问派生类成员
            wwwconsumer.vote();
            wwwconsumer.send();
            wwwconsumer.upload();
           



        }
    }
}



运行一下,看看结果:
高级会员.PNG

看到了吗?高级会员不仅继承了普通会员的姓名、年龄、积分、登陆、发帖子、获得奖励等属性,而且还有金钱、等级、投票、发短信、上传附件等特权。继承真是个好东东!看到这里,你是不是也想继承下苏菲创造的基类去干点什么呢?


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2015-6-3 07:54:11 | 显示全部楼层
苏飞  不是苏菲
发表于 2015-6-3 10:05:53 | 显示全部楼层
罚抄“苏飞”一百遍~~呵呵。名字,怎么能记错嘞~~~
 楼主| 发表于 2015-6-5 05:29:58 | 显示全部楼层
同意,罚100个苏飞的帖子。
 楼主| 发表于 2015-6-5 06:08:17 | 显示全部楼层
我们说了,派生类继承了基类的所有属性,但对于基类的私有属性,却是无法直接使用的。下面以基类苏飞的年龄属性为例讲解:我在上述例子中,对于苏飞的基类中的年龄是以public来定义的。
[C#] 纯文本查看 复制代码
 class Sufei
    {
        //变量成员 
        public string name;
        public  int age;
        public int Age

注意,这个小写的age的属性,是public ,与大写的Age没有什么区别。为什么还要大写的Age,下面慢慢讲,先讲小写的age的可见性的属性对派生类的影响吧。现在我们看到的age是public的。好了,我们在派生类SeniorSufei.cs中对age进行引用,没有任何问题。
[C#] 纯文本查看 复制代码
public SufeiSenior()
        {
            age =15;
            moneyValue++;
                Console.WriteLine("我的会员金钱为:{0}",moneyValue );
                powerValue++;
                Console.WriteLine("我的会员等级为:{0}",powerValue);
        }

如果我们再把基类苏飞中的age改成privat,派生类会出现什么情况呢?我们看看吧。
[C#] 纯文本查看 复制代码
class Sufei
    {
        //变量成员 
        public string name;
        private  int age;

再回到派生类SeniorSufei.cs中看看:

错误

错误

对,派生类只能继承基类的的公有属性(public),而不能继承基类的私有属性(private)。就是这么简单。但为了保持私有属性,又能够被派生类继承,怎么办呢?
 楼主| 发表于 2015-6-6 05:27:27 | 显示全部楼层
要保持基类的封装性又要可以在派生类中使用,有两种途径可以选择,一是定义为protected成员(受保护成员),一是为私有变量设计一个公有的属性,通过属性使用私有变量。
我们先讲第一种方法。这种方法其实很简单,就是将private变更为protected.
[C#] 纯文本查看 复制代码
 class Sufei
    {
        //变量成员 
        public string name;
        protected  int age;


这样就在派生类中可以直接引用age了。
第二种方法就是为私有变量age设计一个Age的公有属性,通过Age使用私有变量。这就是我们在程序中设计小写age与大写Age的原因。我们再把上次那个代码贴出来,让读者回忆。
[C#] 纯文本查看 复制代码
 class Sufei
    {
        //变量成员 
        public string name;
        private  int age;
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                if (value <= 0)
                    age = 0;
                else
                    age = value;
            }
        }

你再在派生类中定义Age看看,没有任何问题了,这样派生类可以通过Age方位私有属性age的数据了,其实这种方法不仅派生类可以使用,其他外界程序也可以使用。
 楼主| 发表于 2015-6-7 08:20:56 | 显示全部楼层
上面说道出于封装性的考虑,我们对基类成员既可以设置成protectde成员,又可以设置为private成员设置公有属性。那么,这两种设置方法有什么区别呢?区别是很明显的,就是protectde只能在派生类中引用,不能为外界引用,而private成员的公有属性不仅可以被派生类引用,而且为外界调用。为了说明上述问题,我们来用上述程序做个例子。
先看看protectde的例子:
我们在苏非类中使用了protected定义了age属性。
[C#] 纯文本查看 复制代码
 class Sufei
    {
        //变量成员 
        public string name;
        protected  int age;
.........

然后,我们在派生类SufeiSenior.cs类中使用age,程序是没有任何问题的。
[C#] 纯文本查看 复制代码
class SufeiSenior:Sufei //苏菲基类派生出高级会员
    {
        //私有成员
        private int moneyValue = 0;//高级会员有钱
        private int powerValue  = 0;//有钱任性,赋予等级
        //构造函数
        public SufeiSenior()
        {
            age = 40;
            moneyValue++;
                Console.WriteLine("我的会员金钱为:{0}",moneyValue );
                powerValue++;
                Console.WriteLine("我的会员等级为:{0}",powerValue);
        }

注意,这里的age只能在派生类中作为成员变量在构造函数中使用,而不能在函数外使用。看图:

字段错误

字段错误

如果,你把age直接在progam.cs主程序中运行也会出现错误,因为age只能在派生类SufeiSeniors中使用。
[C#] 纯文本查看 复制代码
 class Program
    {
        static void Main(string[] args)
        {//申明对象wwwconsumer
            SufeiSenior wwwconsumer = new SufeiSenior();
            //访问基类数据成员
           wwwconsumer.age = 40;
            wwwconsumer.name = "wwwconsumer"
         //访问基类成员
            wwwconsumer.WriteAticle();
            wwwconsumer.JiangLi();
            wwwconsumer.JiangLi();
            //访问派生类成员
            wwwconsumer.vote();
            wwwconsumer.send();
            wwwconsumer.upload();


visual studio直接提示错误

直接使用错误

直接使用错误


如果将private成员设置成公有属性后,实际上就是不直接使用private私有成员,而是在程序中通过修一个与private的栈道,达到暗度陈仓的目的。其实,编程的思路在这里已经是放弃了对private的明攻,而转为暗取了。
我们还是回到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;
            }
        }
    

看到了,我们在这里修了一个大写的Age栈道,但目的还是为了达到偷到成仓age的目的。
我们在主程序中就可以直接引用Age成员了。就这么简单。
[C#] 纯文本查看 复制代码
    class Program
    {
        static void Main(string[] args)
        {//申明对象wwwconsumer
            SufeiSenior wwwconsumer = new SufeiSenior();
            //访问基类数据成员
           wwwconsumer.Age = 40;
           wwwconsumer.name = "wwwconsumer";
         //访问基类成员

其实,再想想,由于Age属于公有属性,不仅在主程序中,甚至在派生类中也可以引用,它本来就是公有属性的字段嘛。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-4-25 18:48

© 2014-2021

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