C#中,类的定义语法很简单,用关键字class来声明就可以,还有其他一些关于类的定义规则,理解起来也不是很难,但真正的难点是在于在什么情况下设计类?类中应该包含什么?
前几天给学员出了一道题,做一个名版管理的小系统。
项目的灵感来源名片多了,查找起来非常不方便,得一张一张查看,也没有分类,如果用一个小软件管理起来,能实现灵活查询,分类,这样会节省每次翻名片的时间。
我们就以这个项目来说一下整体设计,因为这个小项目要求在控制台里实现,所以基本就转成类的实现了。
从头开始吧!
第一步:细化需求
上从项目灵感我们很容易就能明白做什么,第一就是把名片分类,来实现保存,修改,删除。这个基本上没有什么,关于在于能灵活的实现查询,也就是能从多个方面,来寻找自己想找的名片。多个方面指什么呢?比如按公司找,按人名找,按电话查,有时还有按地址查,当然,如果还有发现查找的条件,应该和这些查询类似。
第二步:设计
面向对象编程中,万事万物皆对象,这句话很上口,也很好理解。但在这个系统中都是谁作为对象呢?首先很多人会在第一时间理出第一个对象,名片对象,这个对象封装所有名片上的信息。第二个对象呢?可能对很多人来说就不好整理出来了,如果仔细想想,这个小项目有一个隐喻在这里,就是得有个对象来完成对有名片的管理,也类似于一个名类的集合,就像一个名片盒的对象,一是来存储多张名片,二是来实现管理名片。存储是用字段实现,管理是用方法来实现。这样看来一个名片盒对象产生了,这个名片盒自己有保存,修改,删除名片的方法(在现实世界中,通常这些都是人来完成,在这里不用定义人的对象,要不太浪费了,一个人,只会保存,修改,添加名片,其他的都不会了,呵呵)。还有一个对象,就是程序的Main函数所在的对象,可以在Main函数中实现名片菜单管理的布局,当然再定义一个方法实现也可以,当然,把菜单的管理放在单独的对象中也是可以的,这里就没有限制了,因为这里相对简单。
第三步:实现
 
     /// <summary>

        /// 名片异常类

        /// </summary>

        class CardDataException : Exception

        {

                public CardDataException(string message)

                        : base(message)

                {

                }

        }

        /// <summary>

        /// 名片盒异常类

        /// </summary>

        class CardSetException : Exception

        {

                public CardSetException(string message)

                        : base(message)

                {

                }

        }

}

        /// <summary>

        /// 名片类

        /// </summary>

        class Card

        {

                /// <summary>

                /// 公司名称

                /// </summary>

                string companynaem;

                /// <summary>

                /// 读取和设置公司名称,最大长度为150个字节

                /// </summary>

                public string CompanyName

                {

                        get

                        {

                                return companynaem;

                        }

                        set

                        {

                                if (Encoding.Default.GetByteCount(value) <= 150)

                                {

                                        companynaem = value;

                                }

                                else

                                {

                                        throw new CardDataException("公司名称长度超过了150位。");

                                }

                        }

                }

                /// <summary>

                /// 姓名

                /// </summary>

                string name;

                /// <summary>

                /// 读取和设置姓名,最大长度为20

                /// </summary>

                public string Name

                {

                        get

                        {

                                return name;

                        }

                        set

                        {

                                name = value;

                        }

                }

                //定义其他字段……

    

                /// <summary>

                /// 返回所有属性的组合值

                /// </summary>

                /// <returns></returns>

                public override string ToString()

                {

                        StringBuilder strbui = new StringBuilder();

                        strbui.Append(companynaem);

                        strbui.Append("|");

                        strbui.Append(Name);

                        return strbui.ToString();

                }    

        }

        /// <summary>

        /// 名片盒类

        /// </summary>

        class CardSet

        {

                /// <summary>

                /// 名片集合

                /// </summary>

                List<Card> Cards = new List<Card>();

                public Card this[int index]

                {

                        get

                        {

                                if (index < Cards.Count)

                                {

                                        return Cards[index];

                                }

                                else

                                {

                                        throw new CardSetException("对CardSet的索引超出界限");

                                }

                        }

                        set

                        {

                                if (index < Cards.Count)

                                {

                                        Cards[index] = value;

                                }

                                else

                                {

                                        throw new CardSetException("对CardSet的索引超出界限");

                                }

                        }

                }

                /// <summary>

                /// 保存名片

                /// </summary>

                /// <param name="card">名片</param>

                /// <returns>保存结果</returns>

                public bool SaveCard(Card card)

                {

                        try

                        {

                                Cards.Add(card);

                                return true;

                        }

                        catch

                        {

                                return false;

                                throw new CardSetException("添加名片发生异常");

                        }

                }

                //修改名片……

                //删除名片……

    

                /// <summary>

                /// 模糊查询

                /// </summary>

                /// <param name="condition">查询条件</param>

                public void QueryCard(string condition)

                {

                        foreach (Card card in Cards)

                        {

                                if (card.ToString().Contains(condition))

                                {

                                        Console.WriteLine(card.ToString());

                                }

                        }

                }

                ///其他查询……

                 /// <summary>

                /// 实现对名片集的加载

                /// </summary>

                public void LoadCardSet()

                {

                        //可以加载不同数据源中的信息,比如数据库,xml,文本

                }

                /// <summary>

                /// 寮现对名片集的反回载

                /// </summary>

                public void UnLoadCardSet()

                {    

                        //可以反加载不同数据源中的信息,比如数据库,xml,文本

                }

}

        class Program

        {

                static void Main(string[] args)

                {

                        LayoutMenu lm = new LayoutMenu();

                        lm.PrintMenuUI();

                }

        }

        /// <summary>

        /// 布局名片管理系统名片

        /// </summary>

        class LayoutMenu

        {

                public void PrintMenuUI()

                {

                        //用控制台方法布局选择菜单代码

                }

}
如果要实现上面的类,一些基础的知识是不可或缺的。比如异常的处理,当然,这里的异常处理不属于讨论范围了。
代码如下:
如果我们从分层的角度看的话,名片的类就是数据实体类,相当数据层,名片盒类就是业务层,布局类LayoutMenu就相当处理界面了。关于异常处理的两个类,理应是属于业务层的,因为是业务逻辑出问题后才引出的异常。
在一个需求,有很明显的对象,我们能一眼看出,但有的是比较隐藏的,就需要分析,整理,比较,才能整出一个比较合理的对象。还有,像建立这种思想,实践,学习,模防的过程中建立的,不是听一节课,做一道题能学会的。