传智的光辉岁月-C#基础篇八构造函数和面向对象思想

3.关于 对象创建的几个关键词
Dog d1 = new Dog();

Dog d1 叫做 声明变量
new Dog() 叫做 实例化(创建)对象

4.关于对象、方法和 this 的关系
Dog d1 = new Dog();//在new关键字 开辟堆空间,创建完对象,开始调用构造函数的时候,会把对象的地址 传给 构造函数里的 this
d1.ShowLove();//在调用方法时,会先将 d1里保存的 对象地址 传给 方法里的 this,然后再执行方法体;

5.静态方法 只能 访问 静态成员,不能访问 实例成员(变量和方法)!
实例成员 可以 访问静态成员,也可以访问 实例成员!
实例成员(就是堆空间里某个对象的成员)
*重要区别:【静态方法】的访问 是通过 类名访问,方法里的没有this!
【实例方法】的方法 是通过 对象访问-》会将此对象 传给 方法里的this

7.构造函数(构造方法):
语法: 访问修饰符 类名(参数列表) {方法体代码}
构造函数也有 重载(方法名一样,但是参数的个数或类型不一样)~~!
构造函数调用实际:new 关键字 在实例化对象的时候调用!不能在其它方法中直接调用!

构造函数之间 可以相互调用:通过 :this(参数列表) 来调用!

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace P01构造函数
{
    //类只有两个访问修饰符: public(公共的) internal(程序集共享 - 默认)
    /// <summary>
    /// 男孩类
    /// </summary>
    public class Boy
    {
        /// <summary>
        /// 姓名
        /// </summary>
        public string name = "aa";

        /// <summary>
        /// 年龄
        /// </summary>
        public int age;

        #region 各种 构造函数
        public Boy(string name)
        {
            this.name = name;//将形参 赋给 对象里的 name
        }

        public Boy(int age)
        {
            //如果 年龄 不符合 自然规则,则默认设置给对象 年龄为 18 岁
            if (age < 0 || age > 100)
            {
                this.age = 18;
            }
            else
            {
                this.age = age;//将形参 赋给 对象里的 age
            }
        }

        public Boy(string name, int age1)
            : this(age1)//调用当前类的 另外一个构造函数!
        {
            this.name = name;

            //访问静态成员:类名.静态成员名
            //Boy.boyNum++;
            // 如果 访问代码 和静态成员 在同一个类中,可以简写成:
            boyNum++;
        } 
        #endregion

        #region 1.0 向指定的 MM 表白 void ShowLove(string theGirlName)
        /// <summary>
        /// 向指定的 MM 表白
        /// </summary>
        /// <param name="theGirlName">要表白的女孩名字</param>
        public void ShowLove(string theGirlName)
        {
            Console.WriteLine("Hi~~~{0},你在等我吗?我叫{1},今年{2}岁了,我不帅,但就TM有钱!", theGirlName, this.name, this.age);
        } 
        #endregion

        /// <summary>
        /// 男孩的总个数
        /// </summary>
        public static int boyNum = 0;

        #region 2.0 显示老师的总个数 void ShowBoyNum()
        /// <summary>
        /// 显示老师的总个数
        /// </summary>
        public static void ShowBoyNum()
        {
            //*静态成员中 不能访问 this !
            //Console.WriteLine("老师的名字:" + this.name);
            Console.WriteLine("老师总个数:" + Boy.boyNum);
        } 
        #endregion
    }
}

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace P01构造函数
{
    class Program
    {
        static void Main(string[] args)
        {
            Boy boy1 = new Boy("大林老师",1);
            boy1.ShowLove("小林老师");

            Boy boy2 = new Boy("波波老师", 2);
            boy2.ShowLove("苍老师");

            Boy.ShowBoyNum();

            Console.ReadLine();
        }
    }

}

  

传智的光辉岁月-C#基础篇八构造函数和面向对象思想

 

传智的光辉岁月-C#基础篇八构造函数和面向对象思想

传智的光辉岁月-C#基础篇八构造函数和面向对象思想

 

传智的光辉岁月-C#基础篇八构造函数和面向对象思想

传智的光辉岁月-C#基础篇八构造函数和面向对象思想

 

 

 

 

 

 

 

 

 

 

8.练习题:
商店系统V1.0
1.在商店中 可以 找 售货员 询问 商品列表(商品种类 剩余数量 单价)
2.可以选择 要购买的商品 的 种类、数量
3.售货员会将商品 计算价格 然后 “交给” 客户

分析:
1.商店类(Shop)
成员变量:
商品列表类 ProductList list;
售货员 Saler saler;
成员方法:
开始营业 void Start()
初始化商品数据 void InitProduct()

2.售货员类(Saler)
成员变量:名字 string name,性别 bool sex,年龄 int age
成员方法:
接待客户 void Welcome()
显示商品列表(商品种类 剩余数量 单价)void ShowProduct()
销售货物 void Selling()
显示商品类表 调用商店的
接收用户的输入 GetUserInput()
计算价格 Compute()

3.商品类(Product)
成员变量:商品种类 string type 剩余数量 int count 单价 decimal price

4.商品列表类-相当于仓库(ProductList)
成员变量:商品(数组)Product[] list
成员方法:
添加商品
删除商品
查询所有商品

 


类的编写顺序:商品->商品列表(仓库)->销售员->商店->Program

商店系统V1.0
1.在商店中 可以 找 售货员 询问 商品列表(商品种类 剩余数量 单价)
2.可以选择 要购买的商品 的 种类、数量
3.售货员会将商品 计算价格 然后 “交给” 客户

分析:
1.商店类(Shop)
成员变量:
商品列表类 ProductList list;
售货员 Saler saler;
成员方法:
开始营业 void Start()
初始化商品数据 void InitProduct()
显示商品列表(商品种类 剩余数量 单价)void ShowProduct()

2.售货员类(Saler)
成员变量:名字 string name,性别 bool sex,年龄 int age
成员方法:
接待客户 void Welcome()
销售货物 void Selling()
显示商品类表 调用商店的 ShowProduct()
接收用户的输入 GetUserInput()
计算价格 Compute()

3.商品类(Product)
成员变量:商品种类 string type 剩余数量 int count 单价 decimal price

4.商品列表类(ProductList)
成员变量:商品(数组)Product[] list
成员方法:
添加商品
删除商品
查询所有商品

 

工具帮助类Helper

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace P02ShopV1
{
    /// <summary>
    /// 工具类
    /// </summary>
    public class Helper
    {
        #region 1.0 获取用户输入的一个 整型数值 +int GetAUserNum()
        /// <summary>
        /// 1.0 获取用户输入的一个 整型数值
        /// </summary>
        /// <returns></returns>
        public static int GetAUserNum(string strMsg)
        {
            int num=-1;
            while (true)
            {
                Console.Write(strMsg);
                string strNum = Console.ReadLine();
                if (int.TryParse(strNum, out num))
                {
                    break;
                }
                else
                {
                    Console.WriteLine("请输入数值!");
                }
            }
            return num;
        } 
        #endregion
    }
}

  

商品类Product

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace P02ShopV1
{
    /// <summary>
    /// 商品类
    /// </summary>
    public class Product
    {
        /// <summary>
        /// 静态变量:保存 整个程序中 的 商品编号种子
        /// </summary>
        static int idSeed = 1;

        /// <summary>
        /// 商品编号
        /// </summary>
        public int id;

        /// <summary>
        /// 商品类型名称
        /// </summary>
        public string type;

        /// <summary>
        /// 商品价格
        /// </summary>
        public decimal price;

        /// <summary>
        /// 商品剩余数量
        /// </summary>
        public int count;

        #region 构造函数 +Product(string type, decimal price, int count)
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="type">商品类型名称</param>
        /// <param name="price">商品价格</param>
        /// <param name="count">商品剩余数量</param>
        public Product(string type, decimal price, int count)
        {
            this.id = idSeed++;//注意,是后置的++:会先赋值,在++
            this.type = type;
            this.price = price;
            this.count = count;
        } 
        #endregion
    }
}

  

商品列表类-相当于仓库(ProductList)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace P02ShopV1
{
    /// <summary>
    /// 商品类表类(维护一个商店里的所有商品,有点像【仓库】)
    /// </summary>
    public class ProductList
    {
        #region 全局变量 list,count
        /// <summary>
        /// 0.1 商品数组
        /// </summary>
        Product[] list;

        /// <summary>
        /// 0.2 商品类型的数量
        /// </summary>
        int typeCount = 0; 
        #endregion

        #region 0.0 默认构造函数 ProductList()
        /// <summary>
        /// 默认构造函数
        /// </summary>
        public ProductList()
        {
            //1.初始化 商品数组
            list = new Product[10];
        } 
        #endregion

        #region 1.0 添加商品 +void AddProduct(Product pro)
        /// <summary>
        /// 1.0 添加商品
        /// </summary>
        /// <param name="pro"></param>
        public void AddProduct(Product pro)
        {
            //1. 如果 商品 已经存满 数组了,则扩容
            if (typeCount >= list.Length)
            {
                //1.1 创建一个为原来数组2倍容量的新数组
                Product[] temp = new Product[list.Length * 2];
                //1.2 将原来 数组内容 复制到 新数组中
                list.CopyTo(temp, 0);
                //1.3 将新数组 赋值给 原来的数组变量
                list = temp;
            }
            //2.尝试从仓库中 获取 同类型产品
            Product existPro = GetAProduct(pro.type);
            //2.1如果 商品在仓库中存在,则直接 在数量上 增加
            if (existPro != null)
            {
                existPro.count += pro.count;
            }
            else//2.2如果 商品在仓库中不存在,则直接 追缴到数组中
            {
                //2.将新增的商品加入到数组中
                list[typeCount] = pro;
                //3.商品类型的 数量自增
                typeCount++;
            }
        } 
        #endregion

        #region 1.1 添加商品 +void AddProduct(string type, int count, decimal price)
        /// <summary>
        /// 1.1 添加商品
        /// </summary>
        /// <param name="type">商品类型名称</param>
        /// <param name="price">价格</param>
        /// <param name="count">商品数量</param>
        public void AddProduct(string type, decimal price, int count)
        {
            Product p = new Product(type, price, count);
            AddProduct(p);
        } 
        #endregion

        #region 2.0 按照 商品类型名称 减去一个商品 +Product RemoveAProduct(string strProType)
        /// <summary>
        /// 2.0 按照 商品类型名称 减去一个商品
        /// </summary>
        /// <param name="strProType">商品类型名称</param>
        /// <returns>如果有库存,则返回true;如果没有,则返回false</returns>
        public bool RemoveAProduct(string strProType)
        {
            //1.0 循环 商品数组,但注意,按照商品数量来循环(因为数组中后面的空间可能是空的)
            for (int i = 0; i < typeCount; i++)
            { 
                //a.取出商品对象
                Product proTemp = list[i];
                //b.判断商品类型名称 是否 和 要获取的相同
                if (proTemp.type == strProType)
                {
                    //c.判断找到的商品 的数量 是否有剩余
                    if (proTemp.count > 0)
                    {
                        //c1.如果有,则自减,并返回true
                        proTemp.count--;
                        return true;
                    }
                    else //c2.如果没有,则直接返回false
                    {
                        //c3.移除 产品数组 里的 count = 0 的 产品

                        return false;
                    }
                }
            }
            return false;
        } 
        #endregion

        #region 3.0 返回 包含 所有商品的数组 + Product[] GetAllProducts()
        /// <summary>
        /// 3.0 返回 包含 所有商品的数组
        /// </summary>
        /// <returns></returns>
        public Product[] GetAllProducts()
        {
            Product[] temp=new Product[typeCount];
            //list.CopyTo(temp, 0);
            //Buffer.BlockCopy(list, 0, temp, 0, typeCount);
            for (int i = 0; i < typeCount; i++)
            {
                temp[i] = list[i];
            }

            return temp;
        } 
        #endregion

        #region 3.1 返回 要查找的 商品 - Product GetAProduct(string strProType)
        /// <summary>
        /// 3.1 返回 要查找的 商品
        /// </summary>
        /// <param name="strProType"></param>
        /// <returns></returns>
        private Product GetAProduct(string strProType)
        {
            //1.0 循环 商品数组,但注意,按照商品数量来循环(因为数组中后面的空间可能是空的)
            for (int i = 0; i < typeCount; i++)
            {
                //a.取出商品对象
                Product proTemp = list[i];
                //b.判断商品类型名称 是否 和 要获取的相同
                if (proTemp.type == strProType)
                {
                    //c.判断找到的商品 的数量 是否有剩余
                    if (proTemp.count > 0)
                    {
                        //c1.如果有剩余,则 返回此商品对象
                        return proTemp;
                    }
                }
            }
            return null;
        } 
        #endregion

        #region 4. 根据 id 查询 产品对象 +Product GetProductById(int proId)
        /// <summary>
        /// 4. 根据 id 查询 产品对象
        /// </summary>
        /// <param name="proId">产品id</param>
        /// <returns>如果找到了,则返回产品对象;如果没找到,返回null</returns>
        public Product GetProductById(int proId)
        {
            //1.0 循环 商品数组,但注意,按照商品数量来循环(因为数组中后面的空间可能是空的)
            for (int i = 0; i < typeCount; i++)
            {
                //a.取出商品对象
                Product proTemp = list[i];
                //b.判断商品id 是否 和 要获取的相同
                if (proTemp.id == proId)
                {
                    //c.判断找到的商品 的数量 是否有剩余
                    if (proTemp.count > 0)
                    {
                        //c1.如果有剩余,则 返回此商品对象
                        return proTemp;
                    }
                }
            }
            return null;
        } 
        #endregion
    }
}

  

售货员Saler

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace P02ShopV1
{
    /// <summary>
    /// 售货员
    /// </summary>
    public class Saler
    {
        #region 全局变量 name,sex,age
        /// <summary>
        /// 名字
        /// </summary>
        private string name;
        /// <summary>
        /// 性别
        /// </summary>
        private bool sex;
        /// <summary>
        /// 年龄
        /// </summary>
        private int age; 
        #endregion

        public Saler(string name, bool sex, int age)
        {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }

        #region 1.0 欢迎 +void Welcome()
        /// <summary>
        /// 1.0 欢迎
        /// </summary>
        public void Welcome()
        {
            Console.WriteLine("您好~我是 售货员【{0}】,年龄{1},性别{2}", name, age, sex ? "男" : "女");
        } 
        #endregion

        #region 2.0 销售货物 +void Selling()
        /// <summary>
        /// 2.0 销售货物
        /// </summary>
        public void Selling(ProductList list)
        {
            do
            {
                //1.显示 商品列表
                ShowProduct(list);
                //2.接收用户输入,并显示价格
                GetUserInput(list);
                //3.询问是否要继续卖商品
                Console.WriteLine("您是否要继续选购商品呢?(y/n)");
            } while (Console.ReadLine() == "y");
        } 
        #endregion

        #region 2.1 显示商品列表 +void ShowProduct(ProductList list)
        /// <summary>
        /// 2.1 显示商品列表
        /// </summary>
        /// <param name="list"></param>
        public void ShowProduct(ProductList list)
        {
            //1.获取 仓库 里的 商品列表数据
            Product[] listPro = list.GetAllProducts();
            //2.循环 商品列表
            for (int i = 0; i < listPro.Length;i++ )
            {
                Product pro = listPro[i];
                Console.WriteLine("编号【{0}】:【{1}】 单价:{2} 剩余数量{3}", pro.id, pro.type, pro.price, pro.count);
            }
        } 
        #endregion

        #region 2.2  接收用户输入 -void GetUserInput(ProductList list)
        /// <summary>
        /// 2.2  接收用户输入
        /// </summary>
        private void GetUserInput(ProductList list)
        {
            //1.接收用户 要购买的类型编号
            int id = -1;
            Product pro = null;
            while (true)
            {
                id = Helper.GetAUserNum("请问你要购买什么产品呢(输入产品编号):");
                //1.1判断用户输入的产品编号 是否存在
                pro = list.GetProductById(id);
                if (pro == null)
                {
                    Console.WriteLine("您的产品编号输入有误,请重新输入!");
                }
                else
                {
                    break;
                }
            }

            //2.接收用户的 数量
            int num = -1;
            while (true)
            {
                num = Helper.GetAUserNum("请输入你要购买的数量:");
                //2.1判断用户 要购买的 数量是否足够
                if (pro.count < num)
                {
                    Console.WriteLine("对不起,你要购买的商品数量不够哦~~~,请重新输入数量吧!");
                }
                else
                {
                    break;
                }
            }

            //3.移除商品列表中 指定数量和id的产品
            for (int i = 0; i < num; i++)
            {
                list.RemoveAProduct(pro.type);
            }
            //4.显示购买成功消息
            Console.WriteLine("亲爱的客户,您成功购买了{0}件【{1}】商品,总价格为:{2},谢谢光临~~", num, pro.type, num * pro.price);
        } 
        #endregion
    }
}

  

 商店类Shop

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace P02ShopV1
{
    /// <summary>
    /// 商店类
    /// </summary>
    public class Shop
    {
        #region 全局变量 proList,saler,shopName
        /// <summary>
        /// 商店仓库
        /// </summary>
        private ProductList proList;

        /// <summary>
        /// 售货员
        /// </summary>
        Saler saler;

        /// <summary>
        /// 商店名字
        /// </summary>
        string shopName="连锁商店";
        #endregion

        #region 0.1 构造函数,初始化商店数据 + Shop(Saler saler)
        /// <summary>
        /// 构造函数,初始化商店数据
        /// </summary>
        /// <param name="saler">售货员对象</param>
        public Shop(Saler saler)
        {
            this.saler = saler;//将传入的 售货员对象 设置给 当前商店对象的 saler
            InitProduct();//初始化商店商品数据
        }
        #endregion

        #region 0.2 构造函数,初始化商店数据 +Shop(Saler saler, string shopName)
        /// <summary>
        /// 构造函数,初始化商店数据
        /// </summary>
        /// <param name="saler">售货员对象</param>
        /// <param name="shopName">商店名字</param>
        public Shop(Saler saler, string shopName)
            : this(saler)
        {
            this.shopName = shopName;
        } 
        #endregion

        #region 0.0 初始化商店商品数据 -void InitProduct()
        /// <summary>
        /// 初始化商店商品数据
        /// </summary>
        private void InitProduct()
        {
            //实例化 商店的商品列表(仓库)
            proList = new ProductList();
            //向仓库中 添加 数据
            proList.AddProduct("玩具狗狗", 20, 10);
            proList.AddProduct("玩具猫猫", 40, 10);
            proList.AddProduct("玩具袅袅", 120, 10);
            proList.AddProduct("玩具老虎", 200, 10);
        } 
        #endregion

        #region 1.0 开始营业 +void Start()
        /// <summary>
        /// 开始营业
        /// </summary>
        public void Start()
        {
            Console.WriteLine("欢迎光临{0}", this.shopName);
            //1.售货员打招呼
            saler.Welcome();
            //2.售货员开始售货
            saler.Selling(proList);
        } 
        #endregion

    }
}

  

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace P02ShopV1
{
    class Program
    {
        static void Main(string[] args)
        {
            Saler saler = new Saler("小白", false, 18);
            Shop shop = new Shop(saler, "小白连锁超市");
            shop.Start();
            Console.ReadLine();
        }
    }
}

  

 

传智的光辉岁月-C#基础篇八构造函数和面向对象思想

上一篇:前端面试题整理及答案


下一篇:C#中的new修饰符