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();
}
}
}
運作結果如下圖: