Lập trình hướng đối tượng với C# (1): Mở đầu

1          Mở đầu

1.1       Chương trình theo kiểu cấu trúc

Để viết một chương trình theo kiểu cấu trúc, chúng ta thường khai báo và định nghĩa dữ liệu ở một nơi; sau đó, viết các hàm xử lý dữ liệu, cuối cùng là gọi các hàm thực thi.

Ví dụ, chúng ta viết một chương trình thao tác với tài khoản, gồm các chức năng: nhập tên, xuất tên và sửa tên một tài khoản. Chương trình viết bằng ngôn ngữ C++.

Bạn có thể viết và chạy trên môi trường Visual Studio, hoặc trực tuyến.

Ví dụ: bạn có thể viết và chạy trực tuyến ở đây: https://www.programiz.com/cpp-programming/online-compiler/

[main.cpp]

1    #include <iostream>

2    #include <cstring>

3    using namespace std;

4        

5    char tenTK[50];

6   

7    void NhapTenTaiKhoan()

8    {

9        cout << "Nhap vao ten tai khoan:";

10       cin >> tenTK;

11   }

12   void XuatTenTaiKhoan()

13   {

14     cout << "Ten tai khoan la:" << tenTK << endl;

15   }

16   void SuaTenTaiKhoan()

17   {

18       char tenMoi[50] = "Virus";

19            strcpy(tenTK, tenMoi);

20   }

21  

22   int main() 

23   {

24       NhapTenTaiKhoan();

25        XuatTenTaiKhoan();

26        SuaTenTaiKhoan();

27        XuatTenTaiKhoan();

28        return 0;

29   }

Ở chương trình trên, chúng ta khai báo và định nghĩa dữ liệu ở dòng mã số 5, viết các hàm xử lý ở các dòng mã [7-20], cuối cùng là gọi các hàm thực thi ở các dòng [24-27].

Như vậy, việc lập trình sẽ xoay quanh việc định nghĩa cấu trúc dữ liệu cho hợp lý, viết các hàm xử lý trên dữ liệu và gọi hàm thực thi theo một thứ tự nhất định.

1.2     Chương trình theo kiểu hướng đối tượng

Để lập trình theo kiểu hướng đối tượng, chúng ta sẽ có cách tiếp cận khác so với lập trình theo kiểu hướng cấu trúc.

Về cơ bản, chương trình vẫn gồm các công việc: tổ chức, khai báo dữ liệu; viết các hàm xử lý dữ liệu và gọi hàm thực thi. Tuy nhiên, cách tổ chức các thành phần này có sự khác biệt so với lập trình hướng cấu trúc.

Chúng ta sẽ viết lại chương trình thao tác với tài khoản, để cảm nhận sự khác biệt này.

Trong phần mềm lập trình (Visual Studio hoặc trực tuyến), tạo tập tin AccountTest.cs với nội dung sau (Hình 2):

1 // Hình 2.AccountTest.cs

2 // Tạo và thao tác với một đối tượng của lớp Account

3 using System;

5 class AccountTest

6 {

7    static void Main()

8    {

9         // tạo một đối tượng của class Account 

10        // và gán cho biến myAccount

11        Account myAccount = new Account();

12

13        // hiển thị tên ban đầu của tài khoản myAccount 

14       // (tất nhiên là chưa có tên)

15        Console.WriteLine($"Ten ban dau la: { myAccount.GetName() }");

16

17     // cho người dùng nhập tên và lấy tên đó lưu vào trong tài khoản

18       // nhắc người dùng nhập tên

19        Console.Write("Nhap ten: "); 

20        // lấy tên lưu vào biến theName        

21        string theName = Console.ReadLine(); 

22       

23        // lưu tên vào đối tượng myAccount

24        myAccount.SetName(theName); 

25        

26        // hiển thị tên đã được lưu trong đối tượng myAccount

27        Console.WriteLine($"Ten cua tai khoan la: { myAccount.GetName() }");

28    }

29 }

Tạo tập tin Account.cs với nội dung như sau (Hình 3):

1 // Hình 3. Account.cs

2 // Lớp Account gồm 1 instance variable và

3 // 2 phương thức SetName() và GetName()

4 class Account

5 {

6    // instance variable

7    private string name;

8   

9    // phương thức để thiết lập tên cho đối tượng

10    public void SetName(string accountName)

11    {

12        // lưu tên tài khoản

13        name = accountName;

14    }

15   

16    // phương thức lấy tên của đối tượng

17    public string GetName()

18    {

19        // trả về tên tài khoản khi phương thức được gọi

20        return name;

21    }

22 }

[Trang programiz không cho tạo thêm tập tin, nên bạn có thể viết mã của class Account ngay phía dưới của class AccountTest.]

Kết quả khi chạy chương trình:

Ten ban dau cua tai khoan la:

Nhap ten: Teo

Ten cua tai khoan la: Teo

1.3      Một số khái niệm

- Lớp (class) là một bản thiết kế (blueprint), được sử dụng để tạo ra các đối tượng. Ví dụ lớp Account là bản thiết kế dùng để tạo ra đối tượng “tài khoản ngân hàng”. Thiết kế của lớp Account cho biết một tài khoản ngân hàng sẽ gồm các thông tin (thuộc tính) gì, và các thao tác (phương thức) gì? Lưu ý: lớp AccountTest được sử dụng để làm đầu vào của chương trình, dùng để thực thi các chức năng chung của chương trình nên nó khá đặc biệt so với một lớp thông thường.

- Đối tượng (object) là một thực thể (instance) được tạo ra từ một lớp. Mỗi đối tượng sẽ có giá trị thuộc tính của riêng nó. Ví dụ, đối tượng myAccount chính là một thực thể được tạo ra từ lớp Account. Đối tượng myAccount có tên cụ thể là Teo. Bạn có thể hiểu đơn giản hơn, lớp chính là khuôn để làm bánh, mỗi cái bánh làm ra từ cái khuôn đó chính là một đối tượng.

- Biến đối tượng (instance variable): là một biến, được khai báo bên trong một lớp, và thuộc về một đối tượng cụ thể của lớp đó. Nó được dùng để lưu trữ dữ liệu cho đối tượng. Ví dụ: trong lớp Account, name chính là một biến đối tượng, nó được sử dụng để lưu tên của tài khoản.

- Thuộc tính (property) là một thành phần của lớp, nó cung cấp một cách để truy cập và thay đổi giá trị của các biến đối tượng. Thuộc tính thường được sử dụng để kiểm soát cách truy cập vào dữ liệu bên trong của đối tượng. Ví dụ: chúng ta sẽ tạo ra thuộc tính có tên là Name để truy cập vào biến đối tượng name (xem ở phần sau).

- Phương thức (method) là một hàm (function), được định nghĩa bên trong một lớp. Nó thực hiện một hành động nào đó trên đối tượng. Ví dụ, trong lớp Account có 2 phương thức SetName(), và SetName(). 

-----

Cập nhật: 6/9/2024

Bài sau: Lập trình hướng đối tượng với C# (2): 

-----