天天看點

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#學習之路,學習筆記 第七章 面向對象程式設計:類和對象(一)