Hướng dẫn dùng rectangle net trong PHP
Phần này bắt đầu nghiên cứu, triển khai các vấn đề kỹ thuật liên quan đến Lập trình hướng đối tượng. Show Lập trình hướng đối tượng (Object-oriented programming - OOP), là kỹ thuật lập trình mà điều cốt yếu cần trừu tượng hóa các vấn đề thành các đối tượng (đối tượng có dữ liệu và các ứng xử). Kỹ thuật OOP có 4 tính chất
Khái niệm chung về lớp trong C# Trong lập trình hướng đối tượng, lớp ( Từ lớp đó sinh ra các đối tượng ( Ví dụ: Một lớp mô tả các loại vũ khí, đặt tên là Khi có định nghĩa lớp Khai báo lớp, sử dụng lớpKhi giải quyết các vấn đề thực tiễn, các vấn đề cần giải quyết bạn cần tìm cách trừu tượng hóa nó thành vấn đề tổng quát, như nó có các đặc tính gì, ứng xử của nó ra sao ... Từ đó mới có thể định nghĩa ra lớp để hiện thực hóa vấn đề trừu tượng được. Cú pháp cơ bản như sau:
Trong đó Khai báo và
khởi tạo thành viên dữ liệu (biến, trường dữ liếu) giống với khai báo biến thông thường, nhưng có thêm
Trở lại ví dụ trên, định nghĩa lớp // File VuKhi.cs using System; namespace CS007_Class { public class VuKhi { /// Tên của vũ khí: Súng Lục, Súng Trường, Dao ... public string name = "Tên Vũ Khí"; /// Độ sát thương 10 cấp độ int dosatthuong = 0; /// Phương thức khởi tạo (được gọi khi toán tử new tạo đối tượng) /// tên phương thức trùng tên lớp, trường hợp này không tham số public VuKhi() { this.dosatthuong = 1; } /// Phương thức khởi tạo (được gọi khi toán tử new tạo đối tượng) /// tên phương thức trùng tên lớp, trường hợp này có tham số public VuKhi(string name, int dosatthuong) { this.name = name; SetDoSatThuong(dosatthuong); } /// Hàm này thiết lập độ sát thương public void SetDoSatThuong(int mucdo) { this.dosatthuong = mucdo; } // In ra: Tên vu khí: * * * * * * * * (bằng độ sát thương) public void TanCong() { Console.Write(name + ": \t"); for (int i = 0; i < dosatthuong; i++) { Console.Write(" * "); } Console.WriteLine(); } } } Lớp Giờ ta tiến hành tạo ra các đối tượng cụ thể, áp dụng // Khai báo và khởi tạo đối tượng luôn var ob1 = new ClassName(); // Khai báo, sau đó khởi tạo ClassName ob2; ob2 = new ClassName(); Toán tử . Sau khi đối tượng lớp (object) được tạo, bạn có thể truy cập đến
các thuộc tính, trường dữ liệu và phương thức của đối tượng đó bằng ký hiệu . theo quy tắc Áp dụng: static void Main(string[] args) { var sungluc = new VuKhi(); // Khai báo và khởi tạo sungluc.name = "SÚNG LỤC"; // Truy cập và gán thuộc tính sungluc.SetDoSatThuong(5); // Truy cập (gọi) phương thức VuKhi sungtruong = new VuKhi(); sungtruong.name = "SÚNG TRƯỜNG"; sungtruong.SetDoSatThuong(20); sungluc.TanCong(); // Gọi phương thức sungtruong.TanCong(); // Gọi phương thức //Kết quả chạy SÚNG LỤC: * * * * * SÚNG TRƯỜNG: * * * * * * * * * * * * * * * * * * * * } Từ khóa this Từ khóa Ví dụ, hàm public void SetDoSatThuong(int dosatthuong) { this.dosatthuong = dosatthuong; } Nếu viết thiếu Phương thức khởi tạo - ConstructorPhương thức khởi tạo là phương thức của lớp, nó được thi hành ngay khi đối tượng được tạo (bởi toán tử Ví dụ trên, lớp public class VuKhi { /... public VuKhi() { this.dosatthuong = 1; } public VuKhi(string name, int dosatthuong) { this.name = name; SetDoSatThuong(dosatthuong); } //... } Lúc này có thể sử như sau: // Khởi tạo đối tượng, hàm tạo VuKhi() được gọi var sungluc = new VuKhi(); sungluc.name = "SÚNG LỤC"; sungluc.SetDoSatThuong(5); // Khởi tạo đối tượng, hàm tạo VuKhi(name, dosatthuong) được gọi VuKhi sungtruong = new VuKhi(name: "SÚNG TRƯỜNG", dosatthuong: 20); Kết quả tương tự như ví dụ trên, việc sử dụng hàm khởi tạo đảm bảo dữ liệu của đối tượng bắt buộc phải khởi tạo ngay khi đối tượng đó được tạo - tránh việc sử dụng đối tượng mà dữ liệu không chính xác. Quá tải (Overloading) phương thứcKỹ thuật quá tải phương thức (Method Overloading) là cách thức triển khai khái niệm tính đa hình của lập trình hướng đối tượng. Quá tải phương thức là các phương thức có cùng tên nhưng tham số khác nhau (hàm có thể trả về kiểu dữ liệu khác nhau) Tính đa hình (polymorphism) là cách ứng xử của đối tượng - ứng xử này là khác nhau tùy thuộc vào tình huống cụ thể. Ví dụ lớp public static void WriteLine(); public static void WriteLine(bool value); public static void WriteLine(decimal value); public static void WriteLine(int value); ... Điều này giúp cho bạn khi bạn gọi Ví dụ: public class OverloadingExample { public static int Sum(int a, int b) { return a + b; } public static double Sum(double a, double b) { return a + b; } } Lớp trên có hàm double a = 1; double b = 2; var c = OverloadingExample.Sum(a, b); // c = 3 có kiểu double int a = 1; int b = 2; var c = OverloadingExample.Sum(a, b); // c = 3 nhưng có kiểu int Chú ý: Khai báo hai hàm cùng tên, giống nhau hoàn toàn về tham số chỉ khác kiểu trả về sẽ gây lỗi. Tìm hiểu tính đóng gói lập trình hướng đối tượngTính đóng gói mục đích hạn chế tối đa việc can thiệp trực tiếp vào dữ liệu, hoặc thi hành các tác vụ nội bổ của đối tượng. Nói cách khác, một đối tượng là hộp đen đối với các thành phần bên ngoài, nó chỉ cho phép bên ngoài tương tác với nó ở một số phương thức, thuộc tính, trường dữ liệu nhất định - hạn chế. C# triển khai tính đóng gói này chính là sử dụng các Access Modifiers:
Khi không chỉ rõ Modify thì mặc định là Ví dụ: class Student { private string Name; } Khi sử dụng var s = new Student(); s.Name = "ABC"; Biên dịch sẽ lỗi error CS0122: 'Student.Name' is inaccessible due to its protection level. Vì trường Khi lập trình cố gắng tối đa ẩn thông tin ra bên ngoài lớp càng nhiều càng tốt để đảm bảo tính đóng gói của kỹ thuật lập trình OOP, nó giúp cho code dễ bảo trì và giám sát lỗi. Trường dữ liệu của lớp Trường dữ liệu - khai báo như biến trong lớp, nó là thành viên của lớp, nó là biến. Trường dữ liệu có thể sử dụng bởi các phương thức trong lớp, hoặc nếu là public nó có thể truy cập từ bên ngoài, nhưng cách hay hơn để đảm bảo tính đóng gói khi cần truy cập thuộc tính hãy sử dụng phương thức, còn bản thân thuộc tính là private. Chúng ta đã sử dụng các trường dữ liệu ở những ví dụ trên. Thuộc tính, bộ truy cập accessor setter/getter Ngoài
cách sử dụng trường dữ liệu, khai báo như biến ở phần trước, khai báo THUỘC TÍNH tương tự nhưng nó có cơ chế class Student { private string name; // đây là trường dữ liệu } Lớp này có một trường dữ liệu private là class Student { private string name; // Đây là trường dữ liệu public string Name // Đây là thuộc tính { // set thi hành khi gán, write // dữ liệu gán là value set { Console.WriteLine("Ghi dữ liệu <--" + value); name = value; } //get thi hành ghi đọc dữ liệu get { return "Tên là: " + name; } } } Khi thực hiện var s = new Student(); s.Name = "XYZ"; // set thi hành // In ra: Ghi dữ liệu <--XYZ // Và trường name giờ bằng XYZ Console.WriteLine(s.Name); // get được thi hành // In ra: Tên là: XYZ Thuộc tính Bạn có thể khai báo một thuộc tính tự động, nó hoạt động giống như trường dữ liệu. public string Name {set; get;} Bạn lưu ý khai báo như trên nó là thuộc tính, bạn vẫn có thể khai báo như là trường: public string Name; Tuy nhiên khi không là thuộc tính, thì sẽ thiếu đi một số tính năng ứng dụng cao cấp sau này mà C# hỗ trợ. Source code: CS007_Class (Git), hoặc tải ex007 |