抽象出共性
要求:创建EGoodsManager的项目
题目:现在市面上的电子产品层出不穷,小张准备了一个储存柜专门存放这些产品。请根据题目要求完成简单的储存柜管理程序。
1.存储柜里有若干个格子(为说明问题,假定为3个),每个格子可以放不同的产品,包括MP3播放器(MP3),数码相机(Camera)和手机(Phone),但同一时刻一个格子只能放0或1件商品。
2.管理系统模拟实际储存物品的方式,需要存储新的产品时如果有空位置,按顺序为该产品分配存储的格子;取出产品时显示该产品的信息。
3.定义描述储存柜的类EBox,其中有3个格子用于存放各类电子产品。
4.定义基类EGoods,至少包括纯虚函数ShowMe用于显示产品信息。
5.定义派生类MP3, Camera和Phone,这些产品除了拥有价格(整数)、品牌(字符串)之外,MP3还拥有存储容量(整数,单位M)属性,Camera还拥有光学变焦倍数(整数)属性,Phone还拥有电话号码(字符串)属性。具体实现上述纯虚函数ShowMe,显示每类产品的相应信息。
6.编写main函数,测试上述所要求的各种功能,即根据菜单命令为新的产品分配存储柜子、取走产品(输入格子编号,考虑格子中可能为空的情况)时输出该产品信息.
我的答案是:
电子产品的共性部分是都包含品牌和价格,以及显示自己信息的方法:共性部分的实现代码是:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EGoodsManage
{
public class EGooks
{
private float price;
public float Price
{
get { return price;}
set { price=value;}
}
private string brand;
public string Brand
{
get { return brand; }
set { brand = value; }
}
public virtual string ShowEGoods()
{
return " price is " + Price + " brand is " + Brand;
}
}
}
对于不同的电子产品,它们有不同的特性,因此在某个具体类型的电子产品类只要继承与电子产品的共性部分,就能使具体类型的电子产品拥有电子产品的共性。对于它们的特性则在子类中进行添加,或者重写。
根据题目要求,三个具体类型的电子产品的实现为:
//数码相机
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EGoodsManage
{
public class Camera:EGooks
{
private int multi;
public int Multi
{
get { return multi; }
set { multi = value; }
}
public override string ShowEGoods()
{
return "multi is "+multi+base.ShowEGoods();
}
}
}
//电话
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EGoodsManage
{
public class Phone:EGooks
{
private string number;
public string Number { get; set; }
public override string ShowEGoods()
{
return "Number is "+number+base.ShowEGoods();
}
}
}
//MP3
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EGoodsManage
{
public class Mp3:EGooks
{
private string capacity;
public string Capacity { get; set; }
public override string ShowEGoods()
{
return "Capacity is " +capacity+base.ShowEGoods();
}
}
}
储存柜设计:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EGoodsManage
{
public class EBox
{
public List<EGooks> goods = new List<EGooks>(3);
public bool AddGood(EGooks good)
{
if (goods.Count==3)
{
return false;
}
else
{
goods.Add(good);
return true;
}
}
public void Remove(EGooks good)
{
goods.Remove(good);
}
}
}
主函数设计:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EGoodsManage
{
class MainEntry
{
public static void Main(string[] args)
{
EBox box3 = new EBox();
EGooks[] egoods = new EGooks[3];
Camera nikon = new Camera();
nikon.Brand = "nikon";
nikon.Price = 800;
nikon.Multi = 5;
Mp3 newman = new Mp3();
newman.Brand = "newman";
newman.Price = 200;
newman.Capacity = "1G";
Phone huawei = new Phone();
huawei.Brand = "huawei";
huawei.Price = 50;
huawei.Number = "7141627";
egoods[0] = nikon;
egoods[1] = newman;
egoods[2] = huawei;
for (int i = 0; i < egoods.Length; i++)
{
box3.AddGood(egoods[i]);
Console.WriteLine("存储成功,信息为:"+egoods[i].ShowEGoods());
}
for (int i = 0; i < egoods.Length; i++)
{
box3.Remove(egoods[i]);
Console.WriteLine("取出成功,信息为:" + egoods[i].ShowEGoods());
}
}
}
}
学习心得:在以后的学习中要培养抽象思维的能力,各个类之间存在着共性部分,把这些共性可以设置为父类或者抽象类,或者接口。而特性部分,则有各个具体的类来实现。本题目,就是把电子产品的共性取出来,放到一个父类中,子类通过继承,拥有这些共性,从而实现了代码的复用。基类的引用可以调用实例类的方法,从而实现多态。本题目中,在父类中把显示信息方法定义为虚函数,虚函数实现了显示共性信息的功能。在子类中对虚函数的重写和调用,从而减少了代码的工作量。