《Head First C#》 封装概念

实现类封装的几个想法
1.考虑字段可能会以何种方式被误用

如果设置不当,可能会导致字段被别人修改了,你却不知道,或者漏掉了本来应该执行的步骤却被忽略。

2.是不是类中的所有一切都是公共的
如果类中只有公共字段和方法,你可能需要多花一些时间来考虑封装的问题。

3.哪些字段需要在设置时做一些处理或计算
着些是最有可能需要封装的字段,如果有人以后写了一个方法来改变其中某个字段的值,可能会带来问题,导致你的程序
无法正常公共。

4.只是在需要的才将字段和方法声明为公共
还有要申明的是,封装可以使得你的类更好的维护,哪怕在你使用这段程序过后一段时间,你再想修改或者添加某个功能,也不会无从下手。


-------------将某些数据设置为私有并编写代码来使用这个数据,这就成为封装 (encapsulation)

    class DinnerParty
    {
        //人均消费
        public const int CostOfFoodPerPerson = 25;
        
        public decimal CostOfBeveragesPerPerson; //计算酒水
        public decimal CosOfDecorations = 0;//计算装饰

        /*
            提出一个封装的问题,再原有案例中,下拉菜单是修改numberOfPeople的一种途径,然后
         * 修改后,造成计算装修的未计算的错误,这个主要是因为修改numberofpeople的途径不止一种,
         * 所以我们必须限制修改numberofpeople的手段,这就是我理解的封装,我们先将public 修改为private
         */
        private int numberOfPeople;//人数 然后就是私有变量,开头要小写

        
        

        //同时,我们提供修改NumberOfPeolpe都必须经过这个方法
        public void SetPartyOptions(int people, bool fancy)
        {
            numberOfPeople = people;
            CalculateCostOfDecaorations(fancy);//这样。修改人数一定会经过这个方法,就不会造成遗漏没计算装饰的情况
        }

        public int getNumberOfPeople()
        { 
            return numberOfPeople;
        }
        // 将某些数据设置为私有并编写代码来使用这个数据,这就成为封装



        /// <summary>
        /// 如果选择了健康的选项
        /// 那么每个人的消费会增加5元
        /// </summary>
        /// <param name="isHealth"></param>
        public void SetHealthyOption(bool isHealth)
        {
            if (isHealth)
            {
                CostOfBeveragesPerPerson = 5.00M;
            }
            else
            {
                CostOfBeveragesPerPerson = 20.00M;
            }
        }

        public decimal CalculateCostOfDecaorations(bool isFanta)
        {
            if (isFanta)
            {
                CosOfDecorations = numberOfPeople * 15 + 50;
            }
            else
            {
                CosOfDecorations = numberOfPeople * 7.5m + 30;
            }
            return 0m; 
        }

        public decimal CalculateCost(bool isHealth)
        {

            decimal totalCost = CosOfDecorations +
                                ((CostOfBeveragesPerPerson + CostOfFoodPerPerson) * numberOfPeople);

            //有一个打折的过程,根据是否选了健康选项,会有个5%的折扣
            if (isHealth)
            {
                return totalCost * .95m;
            }
            else
            {
                return totalCost;
            }
        }
    }

    /// <summary>
    /// 对原DinnerParty的封装
    /// </summary>
    class DinnerPartyPackage
    { 
        /*
            修改这个方法
         * 嵌入封装的概念
         */
        public const int NumberOfPerPeople = 25;
        public int NumberOfPeople { get; set; }
        public bool FancyDecorations { get; set; }
        public bool  HealthyOption { get; set; }

        public DinnerPartyPackage(int numberOfPeople, bool fancyDecorations, bool healthyOption)
        {
            NumberOfPeople = numberOfPeople;
            FancyDecorations = fancyDecorations;
            HealthyOption = healthyOption;
        }

        //下面是帮助计算花费的方法的签名,填入计算
        /// <summary>
        /// 计算装潢的方法
        /// </summary>
        /// <returns></returns>
        private decimal CalculteCostOfDecorations()
        {
            if(FancyDecorations)
            {
                return 0m;
            }else
            {
                return 0m;
            }
           
        }
        /// <summary>
        /// 计算酒水的方法
        /// </summary>
        /// <returns></returns>
        private decimal CalculateCostOfBeveragesPerPerson()
        {
             if(HealthyOption)
            {
                return 0m;
            }else
            {
                return 0m;
            }
        }

        //增加一个只读的Cost属性来计算花费
        public decimal Cost {
            get {
                decimal total = CalculteCostOfDecorations();//别忘记加装修的钱
                total+=( CalculateCostOfBeveragesPerPerson()+NumberOfPerPeople)*NumberOfPeople;
                if(HealthyOption)
                {
                    return total*.95m;
                }
                    return total;
                
            } 
        }
    }

    /// <summary>
    /// 封装的小例子,封装类
    /// </summary>
    class Farmer
    {
        private int numberOfCows;//这个私有字段重命名为numberOfCows ,会成为NumberOfCows的 后备字段
        public int BegsOfFeed { get; set; }
        //public const int FeedMulitipliter = 30; //奶牛的单个饲料数还是可以修改的,所以可以设置成public
        private int feedMulitipliter;
        public int FeedMulitipliter { get {
            return feedMulitipliter;
        }  }
         
        //使用构造函数还初始化这个对象,连私有变量也可以初始
        public Farmer(int numberOfCows, int feedMulitipliter)
        {
            NumberOfCows = numberOfCows;
            this.feedMulitipliter = feedMulitipliter;
        }

        //使用属性
        public int NumberOfCows
        {
            get {

                return numberOfCows;
            }

            set {
                numberOfCows = value;

                BegsOfFeed = numberOfCows * FeedMulitipliter;//更改后,这是隐藏的操作,自动计算出,应该准备多少饲料
            }
        }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Head First C》是一本由大卫·格里芬(David Griffiths)和保罗·巴里(Paul Barry)合著的C语言编程入门教程。与一般的编程书籍不同,《Head First C》尝试采用非传统的、有趣的方式来阐述C语言编程基础,使初学者能够更容易地理解和掌握这门语言。 该书内容涵盖了C语言的基本语法、数据类型、运算符、控制结构、函数、数组等方面的知识。在讲解这些知识点时,书中采用了许多大量图解、示例代码、练习题等形式,帮助读者更深入地了解和掌握编程的基本概念和技巧。 此外,《Head First C》还介绍了一些编程的最佳实践,如调试技巧、内存管理等方面的知识,以及如何使用C语言编写程序中的常见问题。这些内容对于初学者来说非常有用,可以帮助他们在编程中更加规范和高效。 总而言之,《Head First C》是一本非常适合初学者入门的C语言编程书籍。它不仅讲解全面,而且内容有趣,对于初学者来说既易于理解又容易上手。如果你想要学习C语言编程,并且想要找一本好的入门书籍,那么《Head First C》肯定是一本值得推荐的书籍。 ### 回答2: 《Head First C》是一本由MIT学院和耶鲁大学教育背景的作者所编写的C语言学习教材,旨在通过生动有趣的图表、插图、问题和实践展示C语言的基础。这本书的特点是利用了大量的视觉元素,其中包括强调、颜色和图标,以吸引读者的注意力和加强记忆。作者通过讲解文字和图片,以及需要学习的主要工具和技术,帮助读者理解C语言的重点概念、语法和数据类型,同时提供了较丰富的示例代码以供实践。 《Head First C》不仅适用于初学者学习C语言,同时也适合有一定经验的开发人员用于回顾和提高技能。本书分为15章,涵盖了从C语言的基础知识到高级主题的内容。其中也包括了大量真实世界中的示例,使读者了解在实际应用中如何利用C语言编写程序。通过本书的学习,读者将可以系统性地学习C语言,丰富自己的编程经验,提高自己的编程技能。 总之,《Head First C》是本富有启发性和诙谐幽默的学习教材,可以帮助读者快乐地学习C语言,同时学到一些有趣的编程技巧,成为优秀的程序员。 ### 回答3: Head First C是一本面向初学者的C语言学习指南,由Kathy Sierra和Bert Bates撰写而成。它以一种简单易懂且生动有趣的方式,引导读者了解C语言的核心概念和基础知识,并提供了丰富的实例和练习,帮助读者增强对C语言的理解和掌握。 本书被广泛认为是一本优秀的教学材料,其中融入了最新的教学技巧和原则。相对于传统的教材,Head First C通过图表、概念映射和故事情节等手段来讲解C语言,以便更深入、更生动地吸引读者。 其重点涵盖了C语言的基础语法、数据类型、指针、函数等各个方面。此外,Head First C还指导读者使用GCC编译器、调试程序和阅读C代码的能力,这些对于日后的编程工作非常重要。 总的来说,Head First C是一本适合所有想要深入了解C语言的读者的好书,既可以作为日常学习的参考,也可以作为初次学习编程的工具书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值