一,人类的起源,及人类的爬,走,跑是怎么炼成的.

1 类和结构,继承和方法复写及扩展方法及部分类
面向对象最重要的元素之一,它是对外部世界的抽象,我们来看一个最标准的类:
     /// <summary>
    /// 一个人
    /// </summary>
    public class People
    {
        /// <summary>
        /// 默认构造函数,建议要有一个
        /// </summary>
        public People()
        {
 
        }
        /// <summary>
        /// 只初始化人的姓名
        /// </summary>
        /// <param name="name"></param>
        public People(string name)
        {
            this.Name = name;
        }
        /// <summary>
        /// 只初始化人的姓名和性别
        /// </summary>
        /// <param name="name"></param>
        /// <param name="gander"></param>
        public People(string name, bool gander)
            : this(name)
        {
            this.Gander = gander;
        }
        /// <summary>
        /// 只和类本身有关的属性,我们把它做成静态的
        /// </summary>
        public static string ClassName = "人类";
        /// <summary>
        /// 在程序运行期间不变的做为常量
        /// </summary>
        public const double PI = 3.1415926;
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 性别,1为女,0为男
        /// </summary>
        public bool Gander { get; set; }
        /// <summary>
        /// 身份证
        /// </summary>
        public string NumID { get; set; }
        /// <summary>
        /// 地址
        /// </summary>
        public string Address { get; set; }
        /// <summary>
        /// 年龄
        /// </summary>
        public int Age { get; set; }
}
如果我们希望建立一个叫小明的人,怎么办?
  People 小明 = new People("小明");
  Console.WriteLine(小明.Name + 小明.Gander); //注意bool型默认为False
 
如果建立一个叫小红的女人,就可以这样了
            People 小红 = new People("小红", true);
            Console.WriteLine(小红.Name +小红.Gander);
OK,这时,我们已经建立了两个人了,我想知道它们的身高体重,怎么办?我们可以想一个人的身高和体重是每个人固有的信息,我们可以把它们放在一个结构里面,就像这样,
/// <summary>
    /// 描述人的身高和体重信息的结构体
    /// </summary>
    public struct HighWeight
    {
        /// <summary>
        /// 只设置身高
        /// </summary>
        /// <param name="height"></param>
        public HighWeight(int high)
            : this()
        {
            this.High = high;
        }
        /// <summary>
        /// 只设置体重
        /// </summary>
        /// <param name="weight"></param>
        public HighWeight(double weight)
            : this()
        {
            this.Weight = weight;
 
        }
        /// <summary>
        /// 对身高和体重进行初始化
        /// </summary>
        /// <param name="height"></param>
        /// <param name="weight"></param>
        public HighWeight(int height, double weight)
            : this(height)
        {
            this.Weight = weight;
        }
        /// <summary>
        /// 身高
        /// </summary>
        public int High { get; private set; } //private属性只允许类内部对本属性赋值
        /// <summary>
        /// 体重
        /// </summary>
        public double Weight { get; private set; }
}
那我们在调用时,就是这样:
HighWeight heghweight = new HighWeight(175);
Console.WriteLine("身高:{0},体重:{1}", heghweight.High, heghweight.Weight);
 
HighWeight heghweight2 = new HighWeight(74.4);
Console.WriteLine("身高:{0},体重:{1}", heghweight2.High, heghweight2.Weight);
 
HighWeight heghweight3 = new HighWeight(175,74.4);
Console.WriteLine("身高:{0},体重:{1}", heghweight3.High, heghweight3.Weight);
 
事实上,身高体重是属于每个人的一种特性,所以,我们应该把它放在人的类上,于是代码就变成了这样:
     /// <summary>
    /// 一个人
    /// </summary>
    public class People
    {
        /// <summary>
        /// 默认构造函数,建议要有一个
        /// </summary>
        public People()
        {
 
        }
        /// <summary>
        /// 只初始化人的姓名
        /// </summary>
        /// <param name="name"></param>
        public People(string name)
        {
            this.Name = name;
        }
        /// <summary>
        /// 只初始化人的姓名和性别
        /// </summary>
        /// <param name="name"></param>
        /// <param name="gander"></param>
        public People(string name, bool gander)
            : this(name)
        {
            this.Gander = gander;
        }
        /// <summary>
        /// 只和类本身有关的属性,我们把它做成静态的
        /// </summary>
        public static string ClassName = "人类";
        /// <summary>
        /// 在程序运行期间不变的做为常量
        /// </summary>
        public const double PI = 3.1415926;
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 性别
        /// </summary>
        public bool Gander { get; set; }
        /// <summary>
        /// 身份证
        /// </summary>
        public string NumID { get; set; }
        /// <summary>
        /// 地址
        /// </summary>
        public string Address { get; set; }
        /// <summary>
        /// 年龄
        /// </summary>
        public int Age { get; set; }
        /// <summary>
        /// 身高和体重
        /// </summary>
        public HighWeight HighWeight { get; set; }
}
继承,这个概念不难理解,它是指一个具有公共对象的类被其它具有相似功能的类继承,其中被继承的类称为基类,所对应的类叫做它的子类,继承在大项目中用的不多,因为继承会增加程序的耦合度(即类之间的相互依赖的程度).回到实例中来,所有人都会运动,无论是爬,走,还是跑,只是根据年龄不同,他们的运动所不同,看代码:
  #region 方法
        public virtual string Run()
        {
            return "刚出生的人只会爬";
        }
  #endregion
上面这段代码是People类的,下面是它的子类,将这个方法进行复写
     /// <summary>
    /// 满1岁的人
    /// </summary>
    public class Yang : People
    {
        /// <summary>
        /// 调用它的父类的构造方法为父类属性赋值
        /// </summary>
        /// <param name="name"></param>
        public Yang(string name)
            : base(name)
        {
 
        }
        public override string Run()
        {
            return "满一岁,人会走了";
        }
}
下面是对类进行调用的过程:
People p = new People();
Console.WriteLine(p.Run());
Yang yang = new Yang("小孩");
Console.WriteLine("姓名:{0},它的运动:{1}", yang.Name, yang.Run());
 
接下来,我要说扩展方法了,顾名思义,就是定义在一个类外部的方法,但这个方法又可以作用在这个类上,看代码:
     /// <summary>
    /// 静态类,包括所以类的扩展方法
    /// </summary>
    public static class AllEvent
    {
        /// <summary>
        /// People的扩展方法,方法和方法所在的类必须是static 
        /// </summary>
        /// <param name="people"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        public static People GetPeopleByName(this List<People> people, string name)
        {
            return people.Where(i => i.Name.Equals(name)).SingleOrDefault();
        }
}
 
调用的时候,可以直接使用它
List<People> peopleList = new List<People>() 
            {
              new People("张三",true),
              new People("李四",false),
            };
      Console.WriteLine(peopleList.GetPeopleByName("李四").Name);
 
接下来,就是一个概念性的东西, System.Nullable<T>,即可空的类型,它可以叫值类型也赋null这种值,定义如下:
Int? Pi          //定义一个页签变量
Int pi=Pi ?? 1 //如果pi为空,然后将1赋值pi
 
OK,我们来看一个问题,我们的人类people目前的结果如图
看起来,有点乱了,我们想把它的方法和属性分开,这样做,有两个好像,第一代码清晰,第二也是引用部分类partial的作用,就是有利于团队开发.(check in  and check out )如图:
到些,第一讲就完了!好累呀!

今天有点时间,想写一个小说,说说面向对象的故事,主人是人类!(一)相关推荐

  1. 最近一直想写一个关于Installshield的连载专题

    好久没抽出时间写写关于.NET方面的东西了,最近一直想写一个关于Installshield的连载专题,该是动笔的时候了.希望最近能多抽点时间放在程序写作上,几大出版社的写书计划一再被推迟很是不好意思呀 ...

  2. 用爬虫写一个,小说下载程序

    用爬虫写一个,小说下载程序 环境:python 3.7.3 没啥难度和技术含量,随便写写.本来程序有部分可用format进行优化,但又想了想小说名可能还会 有一些奇奇怪怪的符号,就没弄了. impor ...

  3. python可抓取数据包括什么_Python对JS型数据抓取有什么特别好的方法吗,pythonjs型抓取,想写一个爬虫,但是需要抓...

    Python对JS型数据抓取有什么特别好的方法吗,pythonjs型抓取,想写一个爬虫,但是需要抓 想写一个爬虫,但是需要抓去的的数据是js生成的,在源代码里看不到,要怎么才能抓到呢? 最好是用pyt ...

  4. 想写一个供教育培训机构排课和教师管理的软件

    想写一个供教育培训机构排课和教师管理的软件 还想写一个MSN签名相关的程序,把自己的历史签名都保存下来. 另外,也打算写一个Iphone的应用程序

  5. 如果英剧《黑镜子》拍第三季,你来写一集剧本策划,你想写一个什么样的故事呢? - 知乎...

    如果英剧<黑镜子>拍第三季,你来写一集剧本策划,你想写一个什么样的故事呢? - 知乎 如果英剧<黑镜子>拍第三季,你来写一集剧本策划,你想写一个什么样的故事呢?

  6. [废弃]想写一个玩魔方的游戏

    有一个idea, 想写一个玩魔方的游戏. P.S: 不过,根据本人的执行力,不知道啥时候可以写出来.盖个戳先吧. 注:想了一下,觉得不好玩.废弃之. 转载于:https://www.cnblogs.c ...

  7. 你能写一个200字的鬼故事吗

    当然可以.以下是一个200字的鬼故事: 有一个叫小明的孩子,他家住在一栋老旧的公寓楼里.每当晚上,他总能听到自己房间外面传来脚步声,但当他打开门时,却总是找不到任何人.有一天晚上,他在床上看书时,忽然 ...

  8. 【nodejs爬虫】使用async控制并发写一个小说爬虫

    最近在做一个书城项目,数据用爬虫爬取,百度了一下找到这个网站,以择天记这本小说为例. 爬虫用到了几个模块,cheerio,superagent,async. superagent是一个http请求模块 ...

  9. 我想写一个网络视频播放器

    最近两个月跟着斯坦福大学白胡子老头的公开课学习了一下swift语言下的ios应用开发,作为实践,我计划开发自己的第一款App:网络视频播放器. 产品设计 什么,就你一个搬砖的还要产品设计?好好,没有产 ...

最新文章

  1. 《LeetCode力扣练习》第8题 C语言版 (做出来就行,别问我效率。。。。)
  2. 《自卑与超越》读书笔记(part2)--生活的不确定性正是我们希望的来源
  3. SAP Spartacus home页面请求product数据生成HTTP请求url的代码处
  4. Centos 7 配置 NFS
  5. js serialize php 解,[转]JavaScript 版本的 PHP serialize/unserialize 完整实现
  6. MATALB(三)绘图命令
  7. [网络编程] - MIME格式详细介绍[转]
  8. C++ 面向对象程序三大特性之 多态
  9. appium之adb常用命令
  10. 易用性强的数据库管理工具DBeaverEE v22.0.1
  11. html中的分页条怎么写,html如何制作分页
  12. java中的数据字典是什么_JAVA中的数据字典
  13. deepin删除应用程序中图标
  14. 转载:BGA封装芯片手工焊接攻略
  15. 详解Minimax算法与α-β剪枝
  16. ASRT中文语音识别系统
  17. 苹果/Mac Fn功能键的作用是什么?Fn键使用小技巧有哪些
  18. CTeX 自动化学报模板使用
  19. python的擅长领域
  20. [转]目前游戏行业内部主要几款游戏引擎的技术对比

热门文章

  1. 微博鸿蒙测试版,不久前华为宣布,将会在6月2日举... - @姬永锋 的微博精选 - 微博国际站...
  2. php更新点击数,始终如一的坚守,PHP对数据更新的更优解
  3. 【Java】 实现一副扑克牌,包含:洗牌+发牌(3个人,一人5张)+输出牌的信息 的逻辑
  4. Bzoj1185最小矩阵覆盖[旋转卡壳+凸包+处理[-0]情况]
  5. 四川大学计算机学院2020推免公示,四川大学2020年推免生录取情况分析
  6. BZOJ 2152 「国家集训队」聪聪可可(点分治)【BZOJ计划】
  7. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛 题解(除了C、G之后补)
  8. 【图论专题】拓扑排序
  9. 0x16.基本数据结构 — Trie树(字典树)+ A C 自 动 机
  10. 使最新版Code::Blocks支持C++11标准