Tải bản đầy đủ (.pptx) (40 trang)

Lập trình hướng đối tượng trong C#

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (135.63 KB, 40 trang )

Lập trình hướng đối
tượng trong C#
(Object Oriented Programming in C#)
Lớp và đối tượng
Class & Object
Giới thiệu về
class

Xây dựng các kiểu dữ liệu mới là đặc tính quan trọng của ngôn
ngữ lập trình hướng đối tượng

Có thể tạo kiểu dữ liệu mới trong C# bằng cách định nghĩa lớp
(class). Mỗi thể hiện của lớp được gọi là đối tượng (object)

Lớp là 1 kiểu dữ liệu chung của một nhóm đối tượng nào đó. Ví dụ:
loài mèo, loài chó
Tạo class
Ví dụ:
public class Cat
{
// Trường (field)
public string _name;
public double _weight;
// Phương thức (method)
public void Sound()
{
Console.WriteLine(“Mew mew”);
}
}
Tương tự như struct, định
nghĩa class trong C# cũng hoàn


toàn tương tự
Tạo đối tượng
với từ khóa
new

Sau khi định nghĩa lớp Cat, chúng ta có thể khai báo đối tượng với
kiểu Cat
Cat cat1, cat2;

Khi chưa gán giá trị cho đối tượng, nó sẽ mang giá trị null. Để tạo
mới 1 đối tượng, ta dùng từ khóa new:
cat1 = new Cat();

Có thể gán đối tượng này bằng đối tượng khác. Bản chất phép
gán này là gán tham chiếu của đối tượng này bằng tham chiếu của
đối tượng kia, khi 1 đối tượng thay đổi (không thay đổi tham
chiếu), đối tượng kia cũng thay đổi theo
cat1 = cat2;
Hàm khởi tạo
(Constructor)

Hàm khởi tạo mặc định: Mỗi class trong C# được cung cấp sẵn 1 hàm
khởi tạo mặc định, khi ta tạo 1 hàm khởi tạo, hàm mặc định này sẽ biến
mất

Trong ví dụ trên, lớp Cat được cung cấp sẵn hàm khởi tạo Cat(), nếu ta
khai báo 1 hàm khởi tạo thì hàm Cat() sẽ mất

VD:
public class Cat

{
public Cat(string name)
{
_name = name;
}
}
Hàm khởi tạo
(Constructor)

Khi đó, ta không thể khởi tạo đối tượng bằng hàm Cat() được nữa mà phải
dung hàm Cat(string name)
// Lệnh đúng
Cat cat1 = new Cat(“Tom”);
// Lệnh có lỗi
Cat cat2 = new Cat();

Ta có thể ghi đè lên hàm khởi tạo mặc định, mục đích để đưa các dữ liệu về
mặc định
public Cat()
{
_name = “Mew”;
_weight = 1;
}
Từ khóa this

Từ khóa this dùng để truy cập thể hiện hiện tại của class, thường
dùng để phân biệt tên thành viên và tên tham số khi có sự trùng
nhau
public class Person
{

public string name;
public Person(string name)
{
this.name = name;
}
}
Móc nối các
hàm khởi tạo
bằng từ khóa
this
public class Cat
{
public Cat(string name, double weight)
{
_name = name;
_weight = weight;
}
public Cat(string name) : this(name, 1)
{ }
public Cat(double weight) : this(“Mew”, weight)
{ }
}
Chúng ta có thể tạo ra 1 hàm
khởi tạo tổng quát rồi gọi nó
trong các hàm khởi tạo khác
Tùy chọn tham
số
public class Cat
{
public Cat(string name = “Mew”, double weight = 1)

{
_name = name;
_weight = weight;
}
}
// Khi tạo đối tượng
Cat cat1 = new Cat(); // name = “Mew”, weight = 1
Cat cat2 = new Cat(“Tom”); // name = “Tom”, weight = 1
Cat cat3 = new Cat(weight: 2); // name = “Mew”, weight = 2
Tương tự như hàm, hàm khởi
tạo cũng có các chức năng: giá
trị tham số mặc định, truyền
giá trị theo tên tham số
Từ khóa static

Trong class, ta có thể định nghĩa các thành viên tĩnh. Để gọi 1
thành viên tĩnh, ta phải gọi thông qua tên lớp chứ không gọi qua
thể hiện của lớp đó
// Gọi đúng
Console.WriteLine(“Hello World”);
// Gọi sai
Console a = new Console();
a.WriteLine(“Hello World”);
Trường dữ liệu
tĩnh
public class TaiKhoan
{
public static int soLuongTK = 0;
public static double laiSuat = 0.07;
public double TienGui;

public TaiKhoan(double sotien)
{
TienGui = sotien;
soLuongTK++;
}
}
Khi tất cả các thể hiện của 1 lớp
đều dùng chung 1 trường dữ
liệu giống nhau, ta có thể định
nghĩa trường đó là tĩnh
Trường hợp hay dùng là để
đếm số đối tượng đã được tạo
Hàm khởi tạo
tĩnh & lớp tĩnh

Trong 1 lớp, ta có thể tạo đối đa 1 hàm khởi tạo tĩnh, hàm này không có
tham số và được thực hiện duy nhất 1 lần trước mọi hàm khởi tạo khác,
thường dùng để tạo giá trị cho các trường dữ liệu tĩnh
public class TaiKhoan
{
public static int soLuongTK;
public static TaiKhoan()
{
soLuongTK = 0;
}
}

Chú ý: Trong các hàm tĩnh, ta chỉ có thể gọi các thành viên tĩnh

Ta cũng có thể định nghĩa 1 lớp là tĩnh, lớp này chỉ được phép có các thành

viên tĩnh
Ba trụ cột của hướng
đối tượng

Tính đóng gói

Tính kế thừa

Tính đa hình
Tính đóng gói
Encapsulation
Các bổ từ truy
xuất trong C#
Bổ từ truy xuất Giới hạn truy cập
public Phạm vi không giới hạn
private Chỉ được sử dụng trong class khai báo nó
protected Chỉ được sử dụng trong class khai báo nó và các
class dẫn xuất
internal Chỉ được sử dụng trong các class cùng khối
assembly với class khai báo nó
protected internal Chỉ được sử dụng trong class khai báo nó và các
class dẫn xuất thuộc cùng khối assembly
C# hỗ trợ 5 loại bổ từ truy xuất
Mặc định với class là internal
Mặc định với các thành viên bên trong class là private
Đóng gói với
phương pháp
truyền thống

Trong C#

public class Humans
{
private string name;
public void setName(string s)
{
name = s;
}
public string getName()
{
return name;
}
}
Giống như C++ và Java, ta có
thể đóng gói dữ liệu trong C#
bằng cách sử dụng bổ từ
private cho dữ liệu rồi viết các
phương thức setter và getter

Trong C++
class Humans{
string name;
public:
void setName(string);
string getName(void);
};
void Humans::setName(string s){
name = s;
}
string Humans::getName(void){
return name;

}
Đóng gói với
thuộc tính
của .NET
(.NET property)

Thay vì phải viết 2 hàm getter và setter riêng biệt như trên, C# cho
phép sử dụng “thuộc tính” (property) để tương tác giống như tương tác
với dữ liệu
public class Humans
{
private string name;
// Thuộc tính (property)
public string Name
{
get { return name; }
set { name = value; }
}
}
Đóng gói với
thuộc tính
của .NET
(.NET property)
// Truyền thống
Humans a = new Humans();
a.setName(“Linh”);
Console.WriteLine(“His name
is {0}”, a.getName());
// Thuộc tính
Humans a = new Humans();

a.Name = “Linh”;
Console.WriteLine(“His
name is {0}”, a.Name);
Sau khi khai báo thuộc tính, ta có thể sử dụng trực tiếp thuộc tính thay vì các
hàm get và set
Thuộc tính

Thuộc tính chỉ đọc và chỉ ghi

Nếu ta chỉ viết phương thức get (hoặc set) cho thuộc tính thì thuộc
tính đó sẽ là thuộc tính chỉ đọc (hoặc chỉ ghi)

Ngoài ra, C# còn cho phép sử dụng các bổ từ trước các phương thức
get, set để giới hạn truy cập đến thuộc tính

Thuộc tính tĩnh

Cách sử dụng giống như trường tĩnh

Các hàm get, set cũng chỉ được gọi các thành viên tĩnh trong class
Mở rộng các
hàm get, set
public class Car
{
public string name;
public string Name
{
get { return name; }
set
{

if (value.Length > 15)
Console.WriteLine(“Name must be less than 16 characters!”);
else name = value;
}
}
}
Thuộc tính tự
động

Nếu 2 hàm get, set của thuộc tính có dạng đơn giản là đọc và ghi
giá trị của 1 trường, ta có thể viết gọn lại thành
public class Pokemon
{
public string Name { get; set; }
public int ID { get; set; }
public int Level { get; set; }
}

C# sẽ tự tạo 1 trường private giống như trường name bên trên
Cú pháp khởi
tạo đối tượng

Với class Pokemon đã tạo ở trên, ta có thể tạo 1 đối tượng Pokemon
Pokemon mewtwo = new Pokemon();
mewtwo.Name = “Mewtwo”;
mewtwo.ID = 150;
mewtwo.Level = 100;

Ta có thể viết gọn đoạn code trên theo cú pháp khởi tạo đối tượng
Pokemon mewtwo = new Pokemon()

{
Name = “Mewtwo”,
ID = 151,
Level = 100,
};
Trường hằng

Trường là hằng số: phải gán giá trị tại câu lệnh khai báo
public const double PI = 3.14;

Trường chỉ đọc (read-only): chỉ được thay đổi giá trị 1 lần ở hàm khởi tạo

Trường tĩnh chỉ đọc: chỉ được thay đổi duy nhất 1 lần ở hàm khởi tạo tĩnh
// class number
public readonly int max;
public static readonly int min;
public Number()
{
max = 100;
}
public static Number()
{
min = 0;
}
Từ khóa
partial

Từ khóa partial dùng để tách 1 class thành nhiều phần chứa trong các file code
khác nhau
// class1.cs

public partial class Humans
{
public string Name { get; set; }
public int Age { get; set; }
}
// class2.cs
public partial class Humans
{
public Humans()
{ }
}

×