一、类和对象

  假设我开了一家烤鱼店,每当客人来点餐时,我就会用笔和纸记录这笔订单,并计算出每单的价格。以下是记录的订单:

单号:00001
种类:清江鱼
口味:香辣
配菜:豆腐
价格:140元
------------
单号:00002
种类:江团
口味:蒜香
配菜:海带
价格:180元

上面所有的内容都需要手写,当客人多的时候很浪费时间,于是我就去打印店按照以下模板打印点餐单(即纸质订单):

单号:
种类:
口味:
配菜:
价格:

这样每位客人点餐时,我就只需要写下客人点餐的内容即可。

在上面的例子中,我记录的每一笔订单都可以看作一个对象,这每一笔订单都有对应的值使之与其他订单不同,但是所有订单都具有相同的属性和行为,通过抽象出这些属性和行为得到点餐单,所以点餐单可以看作订单的类,反之对点餐单填充不同的值,可以得到不同的订单,也就是不同的对象。通过对上面的理解给类和对象下定义,类是具有相同状态和行为的一类事物,对象是一个客观存在且独一无二的个体。类和对象的关系:类是对对象的抽象,对象是对类的填充或实例化。

  类的基本结构:访问修饰符 class 类名{ },其中大括号里可以是类型成员(常量、字段、属性、构造函数、方法、事件等)中的一种或多种构成。

  对象的基本结构是类的实例化:类名 变量名 = new 类名();,其中变量名也叫对象。

  下面我们根据上面的例子设计对应的类,并实现相应的对象。(为使代码简单,访问修饰符均用public)

 /// <summary>
/// 拥有单号、种类、口味、配菜、价格和计算价格行为的订单类
/// </summary>
public class Order
{
#region 字段
/// <summary>
/// 单号(单号为自增字段,无需赋值,自增代码省略)
/// </summary>
public int orderNo; /// <summary>
/// 种类
/// </summary>
public string type; /// <summary>
/// 口味
/// </summary>
public string flavor; /// <summary>
/// 配菜
/// </summary>
public string garnish; /// <summary>
/// 价格
/// </summary>
public decimal price;
#endregion #region 方法
/// <summary>
/// 计算价格
/// </summary>
/// <param name="type">鱼的种类</param>
/// <param name="garnish">配菜种类</param>
public void CalculateThePrice(string type, string garnish)
{
//通过鱼的种类和配菜种类计算价格,过程省略
}
#endregion
}
/// <summary>
/// 实现对象的类
/// </summary>
public class RealizeObject
{
#region 方法
/// <summary>
/// 实现
/// </summary>
public void Realize()
{
//清江鱼香辣味加豆腐配菜需要140元的订单对象
Order order = new Order();
order.type = "清江鱼";
order.flavor = "香辣";
order.garnish = "豆腐";
order.price = ;//直接赋予价格
order.CalculateThePrice("清江鱼", "豆腐");//通过行为计算价格 //江团酱香味加海带配菜需要180元的订单对象
Order orderTwo = new Order();
orderTwo.type = "江团";
orderTwo.flavor = "酱香";
orderTwo.garnish = "海带";
orderTwo.price = ;//直接赋予价格
orderTwo.CalculateThePrice("江团", "海带");//通过行为计算价格
}
#endregion
}

  详解类的实例化过程:Order order = new Order();等号前半部分定义一个类型为Order的变量order,这个变量的值为null;当加上等号后半部分时,才给order变量赋值,并且Order的构造函数会为order的所有字段赋默认值。用点餐单的例子讲当没有等号后半部分时,我想把一张白纸order用作点餐单,但我还没有去打印,当加上等号后半部分后,order这张白纸被我打印成了点餐单,并且我可能在打印完后立马填充对应的值。

二、类和对象相关语法

1、对象初始化语法:使用默认构造函数创建对象并设置对象数据值的简写形式。代码如下:

 public class Garnish { }
public class Order
{
/// <summary>
/// 种类
/// </summary>
public string Type { get; set; } /// <summary>
/// 口味
/// </summary>
public string Flavor { get; set; } /// <summary>
/// 配菜
/// </summary>
public string Garnish { get; set; } /// <summary>
/// 价格
/// </summary>
public decimal Price { get; set; } /// <summary>
/// 其他配菜
/// </summary>
public Garnish OtherGarnish { get; set; } public Order() { } public Order(string type, string flavor, string garnish)
{
Type = type;
Flavor = flavor;
Garnish = garnish;
}
}
public class RealizeObject
{
public void Realize()
{
//清江鱼香辣味加豆腐配菜需要140元的订单对象
//传统方式如下:
Order order = new Order();
order.Type = "清江鱼";
order.Flavor = "香辣";
order.Garnish = "豆腐";
order.Price = ;//直接赋予价格
//对象初始化语法如下:
Order order = new Order//也可以加上(),显式调用默认构造函数
{
Type = "清江鱼",
Flavor = "香辣",
Garnish = "豆腐",
Price =
}; //江团酱香味加海带配菜需要180元的订单对象
//传统方式如下:
Order orderTwo = new Order("江团", "酱香", "海带");
orderTwo.Price = ;//直接赋予价格
//调用自定义构造函数的对象初始化语法如下:
Order orderTwo = new Order("江团", "酱香", "海带")
{
Price =
}; //在Order类中包含其他类型的属性时,对象初始化语法也可以嵌套使用
Order orderThree = new Order
{
OtherGarnish = new Garnish { }
};
}
}

2、部分类型:当一个类的代码过长时,可以通过partial关键字把这个类分割成两个甚至更多(物理文件分割成多个,逻辑上还是一个),一般会把不变的部分和可变的部分分割开来。

 /// <summary>
/// 不变的部分
/// </summary>
public partial class Order
{
//字段 //构造函数
}
/// <summary>
/// 可变的部分
/// </summary>
public partial class Order
{
//属性 //方法
}

注:定义分部类的唯一要求是类型名称必须相同,并且必须定义在相同的命名空间中。

最新文章

  1. C++ 用libcurl库进行http通讯网络编程
  2. Java后台工程师面试杂记——不跳不涨工资星人跳槽经历
  3. Nginx安装第二步手动下载依赖包
  4. synchronized内置锁
  5. Hibernate逍遥游记-第13章 映射实体关联关系-006双向多对多(分解为一对多)
  6. python输出1到100之和的几种方法
  7. block 做参数
  8. springmvc访问路径传递参数
  9. 深入Java虚拟机——类型装载、连接(转)
  10. 2017云计算开源峰会 你是想听Linux谈开源还是想听OpenStack谈开源?
  11. 前端模块化工具--webpack使用感受
  12. MYSQL的REPLACE和ON DUPLICATE KEY UPDATE使用
  13. Spring Boot实战笔记(七)-- Spring高级话题(计划任务)
  14. jenkins之从0到1利用Git和Ant插件打war包并自动部署到tomcat(第一话):初次启动jenkins,输入给定密码后登录失败问题解决
  15. lua 安装
  16. ssh scp 加端口
  17. kepware http接口 nodejs开发
  18. CentOS7 配置静态 ip
  19. Ubuntu16.04怎样安装Python3.6
  20. 设计模式之复合模式(Compound Pattern)

热门文章

  1. pyqt(day3)
  2. 【Beta】Scrum meeting 3
  3. 【Gamma阶段】第一次Scrum Meeting
  4. 华为云ARM64服务器试用
  5. quartus仿真提示: Can&#39;t launch the ModelSim-Altera software
  6. 查看apache httpd server中加载了哪些模块
  7. 【翻译】Flink Table Api &amp; SQL — Hive —— 读写 Hive 表
  8. 在日志中记录Java异常信息的正确姿势
  9. DL Practice:Cifar 10分类
  10. nvarchar, varchar, nchar, char的差別