天天看点

C#学习之路,学习笔记 第七章 面向对象编程:类和对象(一)

Cat.cs

<span style="font-size:14px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _7HelloClass
{
    class Cat
    {
        //7.1定义类//
        //成员变量(字段)
        public string name;     //类通过公有成员(public)实现接口,通过私有成员(private)实现封装
        private int age;         //公有成员可以被外界调用,私有成员不能被外界调用(智能在类的定义代码中使用)
        public int miceCount;

        //把成员变量或成员函数标记为priva,可以有效确保他们只在类内部工作,
        //编译器不允许类以外的任何代码访问他们,从而确保这些数据不被外界修改
        //大大增强了程序的健壮性。另外只要保持公有成员(接口)不变,对类内部进行任何优化都不会对外界产生影响
        //所以我们一般尽量把类的成员设计为私有,以有利于类的升级和改造。
        //哪些成员为公有,哪些成员为私有需要精心考量。设计良好的类
        //既能保持其封装性,又能想外界提供足够的接口。


        //成员函数(方法)      
        //函数:打招呼          
        private void Hello()    
        {                       
            Console.Write("喵,我是{0} ",name);
        }
        //函数:喵喵叫
        public void Meow()
        {
            Hello();
            Console.WriteLine("喵,喵,喵~~~~");
        }
        //函数:捉老鼠
        public void ChaseMice()
        {
            ++miceCount;
            Hello();
            Console.WriteLine("我已经抓到了{0}只老鼠", miceCount);
        }


        //7.5属性//
        //原则上,我们可以随时访问类的公有成员,但有时这种不加限制的访问可能会造成问题
        //比如:Kitty.age = -10;
        //该语句可以通过编译,但年龄显然不应该为负数。在某些问题中这种无效的赋值会产生灾难性的后果
        //有一种办法可以对赋值进行合法性检查,那就是把变量age声明为私有,并定义一个公有函数来访问它
        //代码如下:
        //函数:用来为变量age赋值
        public void SetAge(int ageValue)
        {
            if (ageValue <= 0)
                age = 0;
            else
                age = ageValue;
        }
        //函数:用来读取age的值
        public int GetAge()
        {
            return age;
        }
        //用共有函数读写变量不但可以对数据进行合法性检查,而且提高了类的封装性,一举两得
        //这种专门用来读写数据成员的函数称为:访问器(Assessor)
        //访问器虽然解决了变量age的访问问题,但是人们还是习惯于把年龄作为一个变量对待
        
        //为了解决这个问题,C#设计了一种特殊的用法——属性(Property).
        // 代码如下:
        public int Age
        {
            get
            {
                return age;   
            }
            set
            {
                if (value <= 0)  //value是set访问器的一个隐式参数
                    age = 0;
                else
                    age = value;
            }
            //无论何时使用属性,都会在后台隐式的调用get访问器或set访问器,并执行访问器中的代码
            //属性既有封装性,又可以进行合法性检查,还符合变量的使用习惯,达到了一举三得的效果
            //每个属性背后都对应着一个变量,我们一般让属性和它所对应的变量同名,只是将首字母大写,
            //以示区别。如变量age对应属性Age



            //7.6构造函数——默认构造函数和用户自己编写的带参数和不带参数的构造函数//
            //构造函数:Cat()
            //书中p129

            //7.7析构函数和垃圾回收//
            //析构函数:~Cat()
            //书中p132

        }
    }
}
</span>
           

Program.cs

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

namespace _7HelloClass
{
    class Program
    {
        static void Main(string[] args)
        {
            //7.4对象//
            //声明对象
            Cat Kitty = new Cat();

            //访问数据成员
            Kitty.name = "Kitty";
            Kitty.SetAge(3);    //访问器方式赋值          
            Console.WriteLine("嗨,我是{0},我有{1}岁了。", Kitty.name, Kitty.GetAge());//访问器方式读取值
            Kitty.Age = 4;     //属性+访问器方式赋值 
            Console.WriteLine("嗨,我是{0},我有{1}岁了。", Kitty.name, Kitty.Age);    //属性+访问器方式读取值

            //调用函数成员
            Kitty.Meow();        //喵喵叫
            Kitty.ChaseMice();   //捉老鼠
            Kitty.ChaseMice();   //再次捉老鼠

            Console.ReadLine();
        }
    }
}
           

运行结果如下图:

C#学习之路,学习笔记 第七章 面向对象编程:类和对象(一)