一、类和对象

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

单号: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. 获取Android包名和activity名

    个人主要用2个方法. 方法1:pm list package 方法2: windows:adb shell logcat | findstr START; linux: adb shell logca ...

  2. Excel填坑[0]

    Excel填坑[0] 本着一天水一贴的原则(放p),我又来填坑了.今天做一个很简单的排队图,虽然不难,但因为手机显示问题折腾了半天.感觉做图做表格不仅仅是靠技术,更重要的是思维. 就是这张图,看起来平 ...

  3. Ubuntu16.04.1上搭建分布式的Redis集群,并使用C#操作

    为什么要集群: 通常为了,提高网站的响应速度,总是把一些经常用到的数据放到内存中,而不是放到数据库中,Redis是一个很好的Cache工具,当然了还有Memcached,这里只讲Redis.在我们的电 ...

  4. android ------ 高版本的 Tablayout 下划线宽度

    前面呢,有写过TabLayout的博客,最近开发用到了高本版遇到一些问题,来总结一下 Android--------TabLayout实现新闻客户端顶部导航栏 Android中Tablayout设置下 ...

  5. Visionworks OpenVX

    [TOC] Visionworks OpenVX OpenVX heterogeneous computation framework Spec OpenVX 1.2源碼解析 - 目錄結構 除了官方的 ...

  6. ELK集群安装配置X-Pack

    目前使用的版本不是最新的-6.2.4,6.3以后的版本应该就是集成的了 官方资料: 在线安装步骤:https://www.elastic.co/cn/downloads/x-pack 离线安装步骤:h ...

  7. zabbix删除dashboard无用的报警信息issue

    zabbix出现性能问题,于是清理了一下数据表,在 zabbix_server 端出现性能问题的时候,有大量的插入数据库操作无法执行,触发了大规模服务器不可达的报警经过搜索发现这些信息是跨表联合查询出 ...

  8. PHP $$符号的作用与使用方法

    php中$$符号的定义与作用 在PHP中单个美元符号变量($str),表示一个名为str的普通变量,它可以存储字符串.整数.数组.布尔等任何类型的值. 双美元符号的变量($$str):表示一个可变变量 ...

  9. IntelliJ IDEA(2018.3.5) 设置编码为utf-8编码

    位置一: File->Settings->Editor->File Encodings   位置二: File->Other Settings->Default Sett ...

  10. 解决chrome浏览器插件开发者模式每次启动要确认弹出框的问题

    在日常工作中,我们经常会用到一些浏览器插件,有些插件因为没上架到浏览器的应用商店,只能以开发者模式运行,但是chrome浏览器出了限制,每次重新启动浏览器的时候,就会弹出该插件是否要禁止运行的对话框, ...