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();
}
}
}
运行结果如下图: