一、类和对象

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

单号: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#类类型的更多相关文章

  1. C++primer读书笔记9-转换和类类型

    有时指定自己的类类型来表示某些类型的数据,如SmallInt,然后在为了便于计算将指定一个转换算,类类型,在某些情况下,自己主动转换为指定的类型 <1>转换操作符 operator typ ...

  2. C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】

    重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的位 unsignedchar 相同范围的值,即:0到255. 这个类能够捕获下溢和上溢错误,因此使用起来比内置u ...

  3. Java学习笔记13---如何理解“子类重写父类方法时,返回值若为类类型,则必须与父类返回值类型相同或为其子类”

    子类重新实现父类的方法称重写:重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改:仅当返回值为类类型时,重写的方法才可以修改返回值类型,且必须是父类方法返回值的子类:要么就不修改 ...

  4. typescript可索引接口 类类型接口

    /* 接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用.接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据, ...

  5. java反射三种获得类类型的方法

    public class Test { public static void main(String[] args) { Test t=new Test();//所有的类都是Class类的实例(类类型 ...

  6. SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架

    1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...

  7. 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息

    0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...

  8. 在OnActionExecuted 获取请求参数的值(包含类类型)

    1.在OnActionExecuting里 获取请求参数的值 比较简单 /// <summary> /// 获取首参数的值 /// </summary> /// <par ...

  9. OpenCv中基本数据类型--Point,Size,Rect,Scalar,Vec3b类类型的详细解释

    头文件路径:opencv-2.4.9/modules/core/include/opencv2/core/core.hpp 一.Point类 在这些数据类型中,最简单的就是Point点类,Point类 ...

  10. Java中Class Type 类类型是怎么回事?

    Java中三种方式可以用来表示Class Type(类的实例对象), 第一种,通过隐藏的静态成员变量class来表示:第二种,通过调用该类的对象的getClass方法:第三种,通过Class.forN ...

随机推荐

  1. poi导入读取时间格式问题

    万能处理方案: 所有日期格式都可以通过getDataFormat()值来判断 yyyy-MM-dd-----14 yyyy年m月d日--- 31 yyyy年m月-------57 m月d日  ---- ...

  2. MyBatis(九):Mybatis Java API批量操作(增、删、改、查)

    最近工作中用到了mybatis的Java API方式进行开发,顺便也整理下该功能的用法,接下来会针对基本部分进行学习: 1)Java API处理一对多.多对一的用法: 2)增.删.改.查的用法: 3) ...

  3. 微信小程序for循环中传递动态参数

    for循环中的参数,没法传到对应的 js里,所以直接在 wxml页面上跳转 发送参数的 wxml页面 <view class="uploader" wx:for=" ...

  4. 浅析String.intern()方法

    1.String类型“==”比较样例代码如下:package com.luna.test;public class StringTest { public static void main(Strin ...

  5. Java学习-054-Mybatis IN查询,通过 foreach 获取列表数据

    通过如下语句查询商品订单信息: ,,,) 在 Mapper.java 中定义如下接口: List<GoodsOrder> findGoodsOrderByIds(String ids); ...

  6. 分布式事务二TCC

    分布式事务解决方案之TCC 4.1.什么是TCC事务 TCC是Try.Confirm.Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try.确认Confirm.撤销Cancel ...

  7. Anaconda(三)

    五.TensorFlow安装 这一天由于版本问题走了太多弯路.之前用的conda版本是最新的,自带Python3.7.5,装了之后倒是各种包都能装,用命令: pip install xxx conda ...

  8. iOS - 获取系统时间年月日,阳历(公历)日期转农历的方法

    //获取当前时间 NSDate *now = [NSDate date]; NSLog(@" now date is: %@ ",now); NSCalendar *calenda ...

  9. 自动以读写方式挂载ntfs(新)-苹果之路

    之前的mac下挂载ntfs磁盘的方法在新版本的macos下失效了:<自动以读写方式挂载ntfs-黑苹果之路>,现提供一个有效的方法,系统版本:白苹果10.14.6,参见<Mac OS ...

  10. Docker容器部署Mysql数据库服务器

    本节会用到的Docker命令如下: docker images 查看mysql镜像id docker run -d -p xxxxxxxxxxxxxxx/zhufc/mysql:v2 通过镜像生成 启 ...