Delegate và Event trong C#

Mọi người chỉ em lỗi sai với ạ. Em vừa học delegate và event và được giao bài tập như sau:
Viết 1 chương trình minh hoạ đơn giản cây ATM: khi rút tiền hoặc chuyển tiền thì hệ thống tự động thông báo.(Khi rút tiền hoặc chuyển tiền xong phát sinh sự kiện “đã rút tiền” hoặc “đã chuyển tiền”)
Nhưng em muốn in ra cả thông tin cả tài khoản nhưng khi chạy code thì lại hiện ra thông tin trắng!!! Mọi người chỉ giúp em với ạ…
Vì mới học nên em khá là mơ hồ về phần này ạ @@
Code:

 class KhachHang
{
    private int soTK;
    private string name;
    private long money;
    public int SoTK
    {
        get
        {
            return soTK;

        }
        set
        {
            soTK = value;
        }
    }
    public string Name 
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
    public long Money
    {
        get
        {
            return money;
        }
        set
        {
            money = value;
        }
    }
    public void SubRutTien(EventOfProgram E)
    {
        E.OnChanged += new EventOfProgram.ChangedHandler(RutTien);
    }
    public void SubChuyenTien(EventOfProgram E)
    {
        E.OnChanged += new EventOfProgram.ChangedHandler(ChuyenTien);
    }
    public void RutTien(object sender, EventChange arg)
    {
        Console.WriteLine("Khang hang {0}, So tai khoan {1}\tDa rut tien thanh cong!", arg.name,arg.soTK );
    }
    public void ChuyenTien(object sender, EventChange arg)
    {
        Console.WriteLine("Khach hang{0}, So tai khoan {1}\tDa chuyen tien thanh cong!", arg.name, arg.soTK);
    }
}
 class EventOfProgram
{
    public delegate void ChangedHandler(object sender, EventChange e);
    public event ChangedHandler OnChanged;
    public void Run()
    {
        if(OnChanged != null)
        {
            KhachHang k = new KhachHang();
            OnChanged(this, new EventChange(k.SoTK, k.Name, k.Money));
        }
    }

}
public class EventChange: EventArgs
{
    public readonly int soTK;
    public readonly string name;
    public readonly long money;
    public EventChange(int TK, string Name, long Money)
    {
        soTK = TK;
        name = Name;
        money = Money;
    }
}
 class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("               Welcome to ATM!         ");
        int chose;
        KhachHang kh = new KhachHang();
        Console.WriteLine("Nhap so tai khoan:");
        kh.SoTK = int.Parse(Console.ReadLine());
        Console.WriteLine("Nhap ho ten:");
        kh.Name = Console.ReadLine();
        Console.WriteLine("1. *Rut tien*");
        Console.WriteLine("2. *Chuyen tien*");
        Console.WriteLine("0. *Break!*");
        Console.Write("Nhap su lua chon cua ban : ");
        chose = int.Parse(Console.ReadLine());
        do
        {
            if(chose == 1)
            {
                Console.WriteLine("Nhap so tien can rut:");
                kh.Money = long.Parse(Console.ReadLine());
                EventOfProgram E = new EventOfProgram();                   
                E.Run();
                kh.SubRutTien(E);
            }
            else if(chose == 2)
            {
                Console.WriteLine("Nhap so tien can chuyen:");
                kh.Money = long.Parse(Console.ReadLine());
                EventOfProgram E = new EventOfProgram();
                kh.SubChuyenTien(E);
                E.Run();
            }
            else if(chose == 0)
            {
                break;
            }
        } while (chose != 1 && chose != 2 && chose != 0);
        Console.ReadKey();
    }
}

Có 1 enum để xác định hành động:

public enum CustomerAction{CHUYEN, RUT}

Có 1 delegate thiết kế cho việc thông báo đính kèm stk và hành động:

public delegate void ChangedEventHandler(object sender, CustomerAction action);

Một lớp mô tả tài khoản :

public Name{get; private set;}
public ....
public event ChangedEventHandler OnRutTien;
public event ChangedEventHandler OnChuyenTien;

public void ChuyenTien(){
    // thao tác gì đó
    // thông báo 
    if(OnChuyenTien != null) OnChuyenTien(this, Customer.RUT);
}

// hàm rút viết thông báo tương tự vậy.

Sử dụng:

TaiKhoan tk = new TaiKhoan("Ten tai khoan"); // tự xây hàm dựng nhé. Kiểu nào thì tuỳ.
tk.OnRutTien += Hàm xử lý thông báo rút; // tự điền tương ứng hoặc viết += xong chờ có thông báo thì ấn Tab 2 lần để tự tạo hàm.
tk.OnChuyenTine += Hàm xử lý thông báo chuyển:

tk.Ruttien(); // hành động hoặc 
tk.ChuyenTien(); // 
4 Likes

Cảm ơn anh, giờ em hiểu rồi ạ

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?