Download as pdf or txt
Download as pdf or txt
You are on page 1of 20

LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

INTERFACE
ThS. Nguyễn Quang Phúc
phucnq@uel.edu.vn
NO PAIN NO GAIN Kỹ Thuật Lập Trình 2

NỘI DUNG
1. Khái niệm Interface
2. Sử dụng Interface
3. Thực hiện nhiều Interface
4. Kiểm tra thực hiện Interface
5. Bài tập
NO PAIN NO GAIN Kỹ Thuật Lập Trình 3

1. Khái niệm
 Interface là ràng buộc nhằm đảm bảo các lớp thực hiện nó phải
thực hiện đúng những gì đã được khai báo.
 Interface cũng giống như một lớp nhưng chỉ chứa các khai báo
về biến lớp, thuộc tính, phương thức mà không có chi tiết thực
hiện các thành phần đó.
 Lập trình viên có thể lựa chọn thực hiện một hay nhiều
interface hoặc không thực hiện interface nào. Nhưng nếu đã
chọn thực hiện interface thì phải thực hiện một cách đầy đủ.
NO PAIN NO GAIN Kỹ Thuật Lập Trình 4

2. Sử dụng Interface
Khai báo
 Interface được khai báo giống như khai báo lớp, nhưng sử dụng
từ khóa interface với cú pháp:
public interface TênInterface
{
// Các thành phần
}

Ví dụ:
public interface ILamViec
{
string LamViec(string tenCongViec);
}
NO PAIN NO GAIN Kỹ Thuật Lập Trình 5

2. Sử dụng Interface
Thực hiện
 Một lớp khai báo thực hiện interface bằng dấu hai chấm giống
như khai báo kế thừa từ lớp khác:
class TenLop : ITenInterface
NO PAIN NO GAIN Kỹ Thuật Lập Trình 6

2. Sử dụng Interface
Thực hiện
Ví dụ: khai báo lớp SinhVien và NhanVien thực hiện interface
ILamViec trong ví dụ trước:
public class SinhVien : ILamViec {
public string MSSV { get; set; }
public string HoTen { get; set; }
public SinhVien(string mssv, string hoTen)
{
MSSV = mssv;
HoTen = hoTen;
}
public string LamViec(string tenCongViec)
{
return string.Format("Sinh viên {0} đang {1}",
HoTen, tenCongViec);
}
}
NO PAIN NO GAIN Kỹ Thuật Lập Trình 7

2. Sử dụng Interface
Thực hiện
Ví dụ: khai báo lớp SinhVien và NhanVien thực hiện interface
ILamViec trong ví dụ trước:
public class NhanVien : ILamViec {
public string MaNV { get; set; }
public string HoTen { get; set; }
public string PhongBan { get; set; }
public NhanVien(string maNV, string hoTen, string phongBan){
MaNV = maNV;
HoTen = hoTen;
PhongBan = phongBan;
}
public string LamViec(string tenCongViec){
return string.Format("Nhân viên {0} phòng {1} đang {2}",
HoTen, PhongBan, tenCongViec);
}
}
NO PAIN NO GAIN Kỹ Thuật Lập Trình 8

2. Sử dụng Interface
Thực hiện
Ví dụ: khai báo lớp SinhVien và NhanVien thực hiện interface
ILamViec trong ví dụ trước:
static void Main(string[] args){
Console.OutputEncoding = Encoding.UTF8;
SinhVien svA = new SinhVien("SV1", "Trần Phạm Thanh Trà");
Console.WriteLine(svA.LamViec("Học Bài"));
NhanVien nvB = new NhanVien("NV2", "Trần Phạm Mẫn Nhi", "Nhân Sự");
Console.WriteLine(nvB.LamViec("Báo cáo dự án"));
Console.ReadLine();
}
NO PAIN NO GAIN Kỹ Thuật Lập Trình 9

2. Sử dụng Interface
Thực hiện
Sau khi có các lớp thực hiện interface, ta có thể tạo các đối tượng của
interface. Đối tượng interface tham chiếu đến đối tượng của lớp và có
thể truy xuất những thành phần của interface mà không cần thông qua
đối tượng của lớp:
static void Main(string[] args){
Console.OutputEncoding = Encoding.UTF8;
SinhVien svA = new SinhVien("SV1", "Cao Thị Ly");
ILamViec lv1 = svA;
Console.WriteLine(lv1.LamViec("Học bài"));
NhanVien nvB = new NhanVien("NV2", "Nguyễn Văn Kỳ", "Nhân Sự");
ILamViec lv2 = nvB;
Console.WriteLine(lv2.LamViec("Làm báo cáo"));
Console.ReadLine();
}
NO PAIN NO GAIN Kỹ Thuật Lập Trình 10

3. Thực hiện nhiều Interface


 Trong C#, một lớp chỉ có thể kế thừa được một lớp khác nhưng
có thể thực hiện nhiều interface khác nhau.
Xét ví dụ trước, ta thêm vào interface quản lý:
public interface IQuanLy
{
string GiaoViec(string nguoiLam, string congViec);
}
NO PAIN NO GAIN Kỹ Thuật Lập Trình 11

3. Thực hiện nhiều Interface


Lớp SinhVien thực hiện interface ILamViec và IQuanLy, các
interface phân cách bởi dấu phẩy:
public class SinhVien : ILamViec, IQuanLy {
public string MSSV { get; set; }
public string HoTen { get; set; }
public SinhVien(string mssv, string hoTen) {
MSSV = mssv;
HoTen = hoTen;
}
public string LamViec(string tenCongViec) {
return string.Format("Sinh viên {0} đang {1}",
HoTen, tenCongViec);
}
…..
NO PAIN NO GAIN Kỹ Thuật Lập Trình 12

3. Thực hiện nhiều Interface


Lớp SinhVien thực hiện interface ILamViec và IQuanLy, các
interface phân cách bởi dấu phẩy:
….
public string GiaoViec(string nguoiLam, string congViec)
{
return string.Format
("Sinh viên {0} giao việc {1} cho {2}",
HoTen, congViec, nguoiLam);
}
}
NO PAIN NO GAIN Kỹ Thuật Lập Trình 13

3. Thực hiện nhiều Interface


Lớp SinhVien thực hiện interface ILamViec và IQuanLy, các
interface phân cách bởi dấu phẩy:
static void Main(string[] args)
{
Console.OutputEncoding = Encoding.UTF8;
SinhVien svA = new SinhVien("SV1", "Nguyễn Văn Đức");
IQuanLy ql1 = svA;
Console.WriteLine(ql1.GiaoViec("Trần Thị Hạnh",
"Lập Trình"));
Console.ReadLine();
}
NO PAIN NO GAIN Kỹ Thuật Lập Trình 14

3. Thực hiện nhiều Interface


Một lớp có thể vừa kế thừa từ lớp khác, vừa thực hiện interface.
Ví dụ thêm lớp QuanLy kế thừa từ NhanVien và thực hiện
interface IQuanLy:
public class QuanLy : NhanVien, IQuanLy
{
public QuanLy(string maNV, string hoTen,
string phongBan): base(maNV, hoTen, phongBan)
{}
public string GiaoViec(string nguoiLam, string congViec)
{
return string.Format("Quản lý {0} giao việc {1} cho {2}",
HoTen, congViec, nguoiLam);
}
}
NO PAIN NO GAIN Kỹ Thuật Lập Trình 15

3. Thực hiện nhiều Interface


Ví dụ thêm lớp QuanLy kế thừa từ NhanVien và thực hiện
interface IQuanLy:
static void Main(string[] args) {
Console.OutputEncoding = Encoding.UTF8;
QuanLy nvC = new QuanLy
("QL1", "Trần An Bình", "Nhân Sự");
IQuanLy ql2 = nvC;
Console.WriteLine(ql2.GiaoViec
("Nguyễn Hạnh Phúc", "báo cáo"));
Console.ReadLine();
}
NO PAIN NO GAIN Kỹ Thuật Lập Trình 16

4. Kiểm tra thực hiện Interface


Toán tử “is”
 Cú pháp: Đối_tượng is kiểu_dữ_liệu
Ví dụ:
static void Main(string[] args) {
Console.OutputEncoding = Encoding.UTF8;
NhanVien nvB = new NhanVien ("NV2", "Trần Thị Hạnh", "Nhân Sự");
NhanVien nvC = new QuanLy("QL1", "Nguyễn Văn Phúc", "Nhân Sự");
bool nvB_IQuanLy = nvB is IQuanLy;
bool nvC_IQuanLy = nvC is IQuanLy;
Console.WriteLine("nvB thực hiện IQuanLy: {0}", nvB_IQuanLy);
Console.WriteLine("nvC thực hiện IQuanLy: {0}", nvC_IQuanLy);
Console.ReadLine();
}
NO PAIN NO GAIN Kỹ Thuật Lập Trình 17

4. Kiểm tra thực hiện Interface


Toán tử “as”
 Toán tử as thực hiện việc kiểm tra bằng toán tử is, sau đó thực
hiện phép gán đối tượng cho biến kết quả nếu đối tượng đúng là
kiểu dữ liệu cần kiểm tra (is trả về true) và ngược lại thì gán
null (is trả về false)
NO PAIN NO GAIN Kỹ Thuật Lập Trình 18

4. Kiểm tra thực hiện Interface


Toán tử “as”
Ví dụ: static void Main(string[] args) {
Console.OutputEncoding = Encoding.UTF8;
NhanVien nvB = new NhanVien("NV2", "Trần Văn Giải", "Nhân Sự");
NhanVien nvC = new QuanLy("QL1", "Hồ Thị Thoát", "Nhân Sự");
IQuanLy qlB = nvB as IQuanLy;
IQuanLy qlC = nvC as IQuanLy;
if (qlB == null)
Console.WriteLine("nvB không thực hiện IQuanLy");
else
Console.WriteLine("nvB có thực hiện IQuanLy");
if (qlC == null)
Console.WriteLine("nvC không thực hiện IQuanLy");
else
Console.WriteLine("nvC có thực hiện IQuanLy");
Console.ReadLine();
}
NO PAIN NO GAIN Kỹ Thuật Lập Trình 19

5. Bài tập
Tạo project WPF có giao diện như hình bên dưới, sdụng
Interface Icomparer có sẵn trong C# để thực hiện chức năng
sắp xếp
Q&A

You might also like