今天有点时间,想写一个小说,说说面向对象的故事,主人是人类!(一)
一,人类的起源,及人类的爬,走,跑是怎么炼成的.
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 )如图:
到些,第一讲就完了!好累呀!
今天有点时间,想写一个小说,说说面向对象的故事,主人是人类!(一)相关推荐
- 最近一直想写一个关于Installshield的连载专题
好久没抽出时间写写关于.NET方面的东西了,最近一直想写一个关于Installshield的连载专题,该是动笔的时候了.希望最近能多抽点时间放在程序写作上,几大出版社的写书计划一再被推迟很是不好意思呀 ...
- 用爬虫写一个,小说下载程序
用爬虫写一个,小说下载程序 环境:python 3.7.3 没啥难度和技术含量,随便写写.本来程序有部分可用format进行优化,但又想了想小说名可能还会 有一些奇奇怪怪的符号,就没弄了. impor ...
- python可抓取数据包括什么_Python对JS型数据抓取有什么特别好的方法吗,pythonjs型抓取,想写一个爬虫,但是需要抓...
Python对JS型数据抓取有什么特别好的方法吗,pythonjs型抓取,想写一个爬虫,但是需要抓 想写一个爬虫,但是需要抓去的的数据是js生成的,在源代码里看不到,要怎么才能抓到呢? 最好是用pyt ...
- 想写一个供教育培训机构排课和教师管理的软件
想写一个供教育培训机构排课和教师管理的软件 还想写一个MSN签名相关的程序,把自己的历史签名都保存下来. 另外,也打算写一个Iphone的应用程序
- 如果英剧《黑镜子》拍第三季,你来写一集剧本策划,你想写一个什么样的故事呢? - 知乎...
如果英剧<黑镜子>拍第三季,你来写一集剧本策划,你想写一个什么样的故事呢? - 知乎 如果英剧<黑镜子>拍第三季,你来写一集剧本策划,你想写一个什么样的故事呢?
- [废弃]想写一个玩魔方的游戏
有一个idea, 想写一个玩魔方的游戏. P.S: 不过,根据本人的执行力,不知道啥时候可以写出来.盖个戳先吧. 注:想了一下,觉得不好玩.废弃之. 转载于:https://www.cnblogs.c ...
- 你能写一个200字的鬼故事吗
当然可以.以下是一个200字的鬼故事: 有一个叫小明的孩子,他家住在一栋老旧的公寓楼里.每当晚上,他总能听到自己房间外面传来脚步声,但当他打开门时,却总是找不到任何人.有一天晚上,他在床上看书时,忽然 ...
- 【nodejs爬虫】使用async控制并发写一个小说爬虫
最近在做一个书城项目,数据用爬虫爬取,百度了一下找到这个网站,以择天记这本小说为例. 爬虫用到了几个模块,cheerio,superagent,async. superagent是一个http请求模块 ...
- 我想写一个网络视频播放器
最近两个月跟着斯坦福大学白胡子老头的公开课学习了一下swift语言下的ios应用开发,作为实践,我计划开发自己的第一款App:网络视频播放器. 产品设计 什么,就你一个搬砖的还要产品设计?好好,没有产 ...
最新文章
- 《LeetCode力扣练习》第8题 C语言版 (做出来就行,别问我效率。。。。)
- 《自卑与超越》读书笔记(part2)--生活的不确定性正是我们希望的来源
- SAP Spartacus home页面请求product数据生成HTTP请求url的代码处
- Centos 7 配置 NFS
- js serialize php 解,[转]JavaScript 版本的 PHP serialize/unserialize 完整实现
- MATALB(三)绘图命令
- [网络编程] - MIME格式详细介绍[转]
- C++ 面向对象程序三大特性之 多态
- appium之adb常用命令
- 易用性强的数据库管理工具DBeaverEE v22.0.1
- html中的分页条怎么写,html如何制作分页
- java中的数据字典是什么_JAVA中的数据字典
- deepin删除应用程序中图标
- 转载:BGA封装芯片手工焊接攻略
- 详解Minimax算法与α-β剪枝
- ASRT中文语音识别系统
- 苹果/Mac Fn功能键的作用是什么?Fn键使用小技巧有哪些
- CTeX 自动化学报模板使用
- python的擅长领域
- [转]目前游戏行业内部主要几款游戏引擎的技术对比
热门文章
- 微博鸿蒙测试版,不久前华为宣布,将会在6月2日举... - @姬永锋 的微博精选 - 微博国际站...
- php更新点击数,始终如一的坚守,PHP对数据更新的更优解
- 【Java】 实现一副扑克牌,包含:洗牌+发牌(3个人,一人5张)+输出牌的信息 的逻辑
- Bzoj1185最小矩阵覆盖[旋转卡壳+凸包+处理[-0]情况]
- 四川大学计算机学院2020推免公示,四川大学2020年推免生录取情况分析
- BZOJ 2152 「国家集训队」聪聪可可(点分治)【BZOJ计划】
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛 题解(除了C、G之后补)
- 【图论专题】拓扑排序
- 0x16.基本数据结构 — Trie树(字典树)+ A C 自 动 机
- 使最新版Code::Blocks支持C++11标准