iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Software Development

C#世界初探險系列 第 21

2022鐵人賽 Day 21 建立方法/事件

  • 分享至 

  • xImage
  •  

今天要來說說方法的建立和事件
首先是方法該如何建立呢?假設我們要替car類別定義一個move方法,程式碼如下:

namespace project
{
    class car
    {
        private int _x, _y;
        public void move(int x, int y)
        {
            _x = x;
            _y = y;
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            car car = new car();
            car.move(100, 200);
        }
    }
}

沒錯,只要定義一個包含兩參數的公開move方法就可以了,是不是很簡單阿~~不過如果要配合之前定義的speed屬性,另外定一個加速accelerate方法,就會出現一些缺點,由於speed屬性範圍在0~200之間,因此speed和accelerate都需各做一次範圍檢查。

namespace project
{
    class car
    {
        private int _speed;
        public int speed
        {
            get
            {
                return _speed;
            }
            set
            {
                if (value < 0)
                    value = 0;
                else if (value > 200)
                    value = 200;
                else
                    _speed = value;
            }
        }
        public void accelerate()
        {
            speed++;
            if (_speed > 200) 
                _speed = 200;
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            car car = new car();
            car.speed = 199;
            Console.WriteLine("now speed:{0}", car.speed);
            Console.WriteLine("speed++");
            car.accelerate();
            Console.WriteLine("now speed:{0}", car.speed);
            Console.WriteLine("speed++");
            car.accelerate();
            Console.WriteLine("now speed:{0}", car.speed);
        }
    }
}

可以將上面的accelerate改成這樣

public void accelerate()
{
    this.speed++;
}

this代表物件本身自己,也就是使用物件本身的speed屬性,會先自動呼叫到speed屬性的get取得目前值,再自動呼叫speed的set設定新值,由於本身就設計處理範圍,因此用accelerate來加速時,最高只會到200,不會超出範圍。
如果假設希望car中的accelerate能夠有多種加速方式,如:

accelerate();
accelerate(50);
accelerate("STOP")

那就把程式碼car類別裡面accelerate改寫成如下:

public void accelerate()
{
    this.speed++;
}
public void accelerate(int addspeed)
{
    this.speed += addspeed;
}
public void accelerate(string str)
{
    if(str == "STOP")
        this.speed = 0;
}

再來我們談談事件(Event)
事件的定義跟處理流程算是目前為止最複雜的部份了,在此前得先要了解如何在類別中宣告事件,事件類似方法,但差別是方法中我們必須先定義好所需執行的程式碼,而事件則是在宣告物件時才由設計者針對自己的需求撰寫事件。用之前car的程式來示範,假設我們要做超過200時給警告,程式碼如下:

namespace project
{
    delegate void DangerEvent(int vspeed); //宣告delegate型別
    class car
    {
        private int _speed;
        public event DangerEvent Danger; //宣告事件
        public int speed
        {
            get
            {
                return _speed;
            }
            set
            {
                if (value < 0)
                    value = 0;
                else if (value > 200)
                    if (Danger != null) //啟動事件
                        Danger(value);
                _speed = value;
            }
        }
        public void accelerate()
        {
            speed++;
        }
    }
    internal class Program
    {
        static void TooFast(int vspeed)
        {
            Console.WriteLine("now speed:{0},toofast", vspeed);
        }
        static void Main(string[] args)
        {
            car car = new car();
            car.Danger += new DangerEvent(TooFast); //指定Danger事件由TooFast方法處理
            car.speed = 199;
            Console.WriteLine("now speed:{0}", car.speed);
            Console.WriteLine("speed++");
            car.accelerate();
            Console.WriteLine("now speed:{0}", car.speed);
            Console.WriteLine("speed++");
            car.accelerate();
            Console.WriteLine("now speed:{0}", car.speed);
        }
    }
}

好啦,方法跟事件就到這邊告一段落啦
大家掰掰~~


上一篇
2022鐵人賽 Day 20 建立屬性
下一篇
2022鐵人賽 Day 22 例外(try)處理
系列文
C#世界初探險30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言