Chương 019: Class

OOP Hell.

Tóm tắt chương trước

Sau khi thoát khỏi bẫy của di tích, bạn và Kurobo quyết định nghỉ ngơi một chút trước khi tiếp tục đi sâu vào bên trong.

Di tích này quả thực rất nguy hiểm. Phải chuẩn bị thật tốt tâm trạng và thể lực mới được.

Kiến thức chương này

  • Cách sử dụng từ: object instance.
  • Đặt tên class.
  • new new()
  • Constructor
  • Từ khoá this public

Cốt truyện

“Nè~ nè~ chủ nhânnnnn~” – Kurobo từ đâu đó bay tới gần bạn.

Chắc hẳn trong lúc bạn ở trong cuốn sách, Kurobo cũng đi khám phá xung quanh.

“Chủ nhân có thấy cuốn sách này giống ‘Save Game’ không?” – Kurobo lượn lờ quanh cuốn cổ thư.

“Ý là, nó chỉ ‘save’ ở những nơi đủ ‘safe‘ á.” – Kurobo dừng lại.

“Nên là Kurobo lụm được quá nhiều thứ xung quanh nè~” – Kurobo chỉ vào đống rác trước mặt bạn.

Xem nào, một mảnh giáp vụn, một bình thuốc đen ngòm, một thanh kiếm gãy, một chiếc khoá hỏng,…

Thật sự luôn!?

Không có gì dùng được hết á.

Bạn bắt đầu mường tượng ra lí do Kurobo bị bỏ lại ở hành tinh này…

Lời nói đầu

Xin chúc mừng, bạn là một trong số ít những người còn… “sống sót” tới chương này!

Bắt đầu từ bây giờ, hãy thực sự tập trung nhé! Những kiến thức cực kì quan trọng sắp được giới thiệu rồi đây.

Ở chương này, bạn sẽ bắt đầu bước một chân vào thế giới lập trình hướng đối tượng. Sẽ không còn khái niệm đúng sai nữa, mà quan trọng hơn là kết quả bạn muốn đạt được.

Điều này nghĩa là, bạn đừng bao giờ sợ code sai, hay xấu hổ việc phải show code cho người khác xem. Miễn bạn đạt được kết quả thì không có gì phải lo cả (dù cách của bạn có đần đến mức nào đi nữa).

Giống như việc vẽ một bức tranh vậy.

Bạn có thể vẽ xấu, vẽ đẹp, nhưng chẳng có gì gọi là vẽ sai cả. Quan điểm của GNL là ủng hộ “kết quả”. Nghĩa là, bạn phải có kết quả, có sản phẩm thì mới có tiến bộ, không cần biết tốt xấu như thế nào.

Rồi bạn sẽ làm tốt hơn theo thời gian. Suy cho cùng, lập trình hướng đối tượng đòi hỏi bạn phải mất cả năm trời mới có cho mình những cách giải tối ưu.

Từ chương này trở đi, RẤT NHIỀU challenge sẽ được thêm vào và chúng sẽ không có lời giải.

Hãy luyện tập.

Và tiến bộ.

Chúc may mắn.

Cha mẹ đẻ ra con thì đứa con sẽ mang gen của hai người. Nếu coi class là cha mẹ thì đứa con của class là object hoặc instance.

Trong C# và Unity, object và instance tương đối giống nhau, nhưng chúng cũng có một xíu khác biệt về văn cảnh:

  • Object mang nghĩa rộng hơn, chúng chỉ chung các instance. VD: object Bullet, object Goblin, object Bow… Ta dùng từ object khi những người trong cuộc nói chuyện không cần quan tâm đến class.
  • Instance mang nghĩa trực tiếp hơn, khi nói instance thì phải nói instance của class nào. VD: instance Bullet của class Projectile, instance Goblin của class Enemy, instance Bow của class Weapon… Ta dùng từ instance khi muốn nhấn mạnh đến class.

Để khai báo class, bắt đầu với từ khoá class + <tên class bạn muốn tạo> + {}.

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

class Skill
{

}

Tên của class nên là “Noun” – “Danh từ”, số ít, viết hoa chữ cái đầu và phải ngắn gọn nhất có thể.

  • Nên: Skill, Animal, Book, Item, Enemy,…
  • Không nên: Skills, Fly, damage, Drops, Blue, TheHouseVillage,…

Bạn có thể tạo nhiều class trong cùng 1 file bằng cách ghi xuống dưới cùng như sau:

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

class Skill {}
class Enemy {}
class Item {}

Tuy nhiên, việc tạo nhiều class trong một file không được khuyến khích cho lắm. Cách tốt nhất là tách riêng mỗi class thành một file. Trong cửa sổ của Solution Explorer, chuột phải vào bất kì vị trí nào > Chọn Add > Class… > Sau đó gõ tên class bạn muốn tạo là được.

Trong trường hợp không thấy cửa sổ này, hãy tìm trong View > Solution Explorer.

Như thế này là đã thành công.

Bây giờ hãy xoá hết mọi thứ, chỉ để lại những thành phần cơ bản nhất.

Vậy là bước tạo class về cơ bản đã xong.

Bạn đã khởi tạo class nhưng class này hiện tại chưa có công dụng gì cả.

Hãy thêm vào một vài field nhé.

class Item
{
    public string name;
    float price;
}

Một từ khoá mới xuất hiện! public. public là từ khoá khiến các object dùng được biến hoặc method của nhau.

Để tạo class instance, hãy quay lại file Program.cs và gõ như sau.

Item bottle = new Item();

Như vậy, bạn đã khởi tạo một object tên là bottle, hay nói cách khác bạn đã tạo một instance của Item.

Việc tạo instance của class bắt buộc phải có từ khoá new. Còn Item() constructor của class Item.

Lúc này có thể truy cập và sửa đổi field của name của bottle, nhưng field price thì không thể truy cập do không có từ khoá public.

Item bottle = new Item();

bottle.name = "Alcohol";
Console.WriteLine(bottle.name); //Alcohol

Khi cố truy cập field price của bottle, máy sẽ báo lỗi.

Phải thêm public vào mới có thể truy cập được vào field price trong object bottle.

class Item
{
    public string name;
    public float price;
}

Như vậy, ta có thể tạo hàng ngàn instance khác nhau mà mỗi instance đều có một thông số riêng, không chung đụng đến nhau.

Item bottle = new Item();
Item ring = new Item();

bottle.name = "Alcohol";
bottle.price = 100f;
ring.name = "Diamond Ring";
ring.price = 1000000f;

Console.WriteLine(bottle.name); //Alcohol
Console.WriteLine(ring.name); //Diamond Ring
Console.WriteLine(bottle.price); //100
Console.WriteLine(ring.price); //1000000

Khi một instance của class được khởi tạo, máy sẽ mặc định gọi function (hàm) này đầu tiên. Ý nghĩa của nó đúng như tên gọi – constructor – khởi tạo.

Mặc dù là function, nhưng Constructor không được phép return bất kì giá trị nào.

Nếu không viết constructor, máy sẽ mặc định tạo sẵn cho bạn một cái như sau:

class Item
{
    public Item() {}
    public string name;
    float price;
}

Constructor mặc định không có tác dụng gì nhiều nhưng bạn có thể tuỳ chỉnh nó để gán giá trị ban đầu cho object. Cách sử dụng giống y hệt những gì đã học với function.

class Item
{
    public Item(string itemName, float itemPrice) 
    {
        name = itemName;
        price = itemPrice;
    }
    public string name;
    public float price;
}
Item bottle = new Item("Alcohol", 100f);
Item ring = new Item("Diamond Ring", 1000000f);

Console.WriteLine(bottle.name); //Alcohol
Console.WriteLine(ring.name); //Diamond Ring
Console.WriteLine(bottle.price); //100
Console.WriteLine(ring.price); //1000000

Một class có thể có bao nhiêu constructor tuỳ thích.

class Item
{
    public Item(string itemName, float itemPrice) 
    {
        name = itemName;
        price = itemPrice;
    }
    public Item(string itemName)
    {
        name = itemName;
    }

    public string name;
    public float price;
}

Trong một số trường hợp, bạn sẽ thấy hàm dựng được viết như sau:

class Item
{
    public Item(string name, float price) 
    {
        this.name = name;
        this.price = price;
    }

    public string name;
    public float price;
}

Mặc dù trùng tên với field, nhưng C# vẫn cho phép việc đặt tên trùng.

Nếu trong function có biến trùng tên field thì khi gọi biến trong function, bạn chỉ có thể dùng biến của function. Field đã bị ẩn truy cập (name hiding).

Từ khoá this được dùng để chỉ rõ ràng field của class.

Khi làm việc với phiên bản C# đời cao, có thể bỏ Item(); chỉ cần dùng new():

Item bottle = new("Alcohol", 100f);
Item ring = new("Diamond Ring", 1000000f);

Lời kết

Bắt đầu từ chương này, cấu trúc của GMA sẽ thay đổi.

Lập trình hướng đối tượng đòi hỏi bạn phải suy nghĩ rất nhiều trước khi tạo lập một class hoặc một object mới.

Khi một chương trình dần to ra, class và object sẽ liên hệ với nhau chằng chịt. Bạn có thể sửa một class và khiến toàn bộ phần mềm không còn work. Lúc này, câu hỏi được đặt ra không phải vấn đề bạn có biết nhiều từ khoá hay không, mà là bạn có chiến lược code hay không, bạn hiểu rõ thiết kế của mình tới đâu, bạn ghi chú như thế nào để không bị nhầm.

Chúng ta sẽ còn gặp lại.

Và làm challenge nhiều nhất có thể nhé.

Chương Trước | Tổng quan | Chương Kế

Kurrwo

Công nhân👷gõ 💬 văn bản ⌨️ trò chơi 🎮 điện tử 📱 👏👏👏

Post navigation

Subscribe
Notify of
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments