C#类类型
一、类和对象
假设我开了一家烤鱼店,每当客人来点餐时,我就会用笔和纸记录这笔订单,并计算出每单的价格。以下是记录的订单:
单号: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
{
//属性 //方法
}
注:定义分部类的唯一要求是类型名称必须相同,并且必须定义在相同的命名空间中。
C#类类型的更多相关文章
- C++primer读书笔记9-转换和类类型
有时指定自己的类类型来表示某些类型的数据,如SmallInt,然后在为了便于计算将指定一个转换算,类类型,在某些情况下,自己主动转换为指定的类型 <1>转换操作符 operator typ ...
- C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】
重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的位 unsignedchar 相同范围的值,即:0到255. 这个类能够捕获下溢和上溢错误,因此使用起来比内置u ...
- Java学习笔记13---如何理解“子类重写父类方法时,返回值若为类类型,则必须与父类返回值类型相同或为其子类”
子类重新实现父类的方法称重写:重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改:仅当返回值为类类型时,重写的方法才可以修改返回值类型,且必须是父类方法返回值的子类:要么就不修改 ...
- typescript可索引接口 类类型接口
/* 接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用.接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据, ...
- java反射三种获得类类型的方法
public class Test { public static void main(String[] args) { Test t=new Test();//所有的类都是Class类的实例(类类型 ...
- SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架
1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...
- 在OnActionExecuted 获取请求参数的值(包含类类型)
1.在OnActionExecuting里 获取请求参数的值 比较简单 /// <summary> /// 获取首参数的值 /// </summary> /// <par ...
- OpenCv中基本数据类型--Point,Size,Rect,Scalar,Vec3b类类型的详细解释
头文件路径:opencv-2.4.9/modules/core/include/opencv2/core/core.hpp 一.Point类 在这些数据类型中,最简单的就是Point点类,Point类 ...
- Java中Class Type 类类型是怎么回事?
Java中三种方式可以用来表示Class Type(类的实例对象), 第一种,通过隐藏的静态成员变量class来表示:第二种,通过调用该类的对象的getClass方法:第三种,通过Class.forN ...
随机推荐
- [算法模板]ST表
[算法模板]ST表 ST表和线段树一样,都能解决RMQ问题(范围最值查询-Range Minimum Query). 我们开一个数组数组\(f[maxn][maxn\log_2]\)来储存数据. 定义 ...
- SpringBoot升级报错:Failed to bind properties under 'logging.level'
错误详细信息: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties un ...
- Netty通信网络参数配置
Netty服务端/客户端网络通信过程中常用的参数: Name Associated setter method "writeBufferHighWaterMark" 默认64 * ...
- 基于vue和echarts的数据可视化实现
基于vue和echarts的数据可视化: https://github.com/MengFangui/awesome-vue.git
- 讨厌的linux----vsftpd 匿名上传配置
核心一句话: vsftpd: refusing to run with writable anonymous root 匿名账号的根目录,不允许写入,否则匿名登录 验证失败 只有再 ftp 命令操作, ...
- Linux的tmpfs和ramfs
tmpfs tmpfs是一种虚拟内存文件系统, 它的存储空间在VM里面,现在大多数操作系统都采用了虚拟内存管理机制, VM(Virtual Memory) 是由Linux内核里面的VM子系统管理. V ...
- virtualenv, conda, pip分别是什么
自己一直使用virtualenv,但是发现很多工具或框架都是以来conda,于是就网上搜了下二者的区别,感觉这篇文章讲的比较清楚:https://blog.csdn.net/zhouchen1998/ ...
- CentOS 使用官方源yum安装最新nginx版本
CentOS 使用官方源yum安装最新nginx版本 1.创建nginx.repo # vi /etc/yum.repos.d/nginx.repo 2.添加内容#如果是CentOS6,文件内容如下: ...
- resources-plugin-2.6.pom.part.lock (没有那个文件或目录)
由于 自定义 maven 仓库没权限 /home/repository 自定义目录 [root@localhost Service]# cat /etc/group|grep jenkins jenk ...
- 在条件判断中使用 all() / any()
在条件判断中使用 all() / any() all() 和 any() 两个函数非常适合在条件判断中使用.这两个函数接受一个可迭代对象,返回一个布尔值,其中: all(seq):仅当 seq 中所有 ...