Hay nói cách khác: Lớp trừu tượng là lớp dùng để khai báo thuộc tính và phương thức cho các lớp khác sử dụng.. Khái niệm: Một class mà được định nghĩa với từ khóa abstract và bao gồm n
Trang 1-
-LẬP TRÌNH HƯỚNG ĐỐI
TƯỢNG
Đề tài:
INTERFACE (LỚP TRỪU
TƯỢNG)
Trang 2Nha Trang, tháng 5 năm 2016
TRƯỜNG ĐẠI HỌC THÔNG TIN LIÊN LẠC
KHOA CÔNG NGHỆ THÔNG TIN
ĐỀ TÀI
Interface (Lớp trừu
tượng)
GVHD: Ngoan
Lớp: ĐHCN1A
Nhóm sinh viên thực hiện:
Trang 3 Huỳnh Quốc Đạt (nhóm trưởng)
Triệu Nam Dương
Lê Văn Cường
Nguyễn Duy Thanh Tùng
Nha Trang, tháng 5 năm 2016
Trang 4NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN
Trang 5
Lớp trừu tượng (Abstract Class) là lớp dùng
để định nghĩa những thuộc tính và hành vi chung của những lớp khác Hay nói cách
khác: Lớp trừu tượng là lớp dùng để khai báo thuộc tính và phương thức cho các lớp khác
sử dụng.
Ø (Lớp trừu tượng không cho phép khởi tạo tham
số, chỉ khai báo mà thôi)
Ø Lớp trừu tượng được dùng như một lớp cha (base class) của các lớp có cùng bản chất
Ø Bản chất ở đây được hiểu là kiểu, loại, nhiệm
vụ của class
Ø Mỗi lớp dẫn xuất (derived class - lớp con) có thể thừa kế từ một lớp trừu tượng
Ø Từ khóa abstract được dùng để định nghĩa một Lớp trừu tượng
Ø Những lớp được định nghĩa bằng cách dùng
từ khóa abstract thì không cho phép khởi tạo đối tượng (instance) của lớp ấy
1 Khái niệm:
Một class mà được định nghĩa với từ khóa abstract và bao gồm nhiều hơn một phương thức
mà không có thân bên trong khi đó ta gọi là abtract class Nó có thể bao gồm nhiều phương thức khác có thể thực thi trong nó
Một abstract class cũng tương tự abstract class cũng có thể khai báo các phương thức abstract trong nó Nhưng khác một chỗ là một interface không thể thực thi bất cứ một phương thức nào trong nó
2 Mục đích:
Ø Một abstract class có thể coi là một class cơ
sở không đầy đủ
Trang 6Ø Abstract class có thể coi như một quy tắc chung cho các sub class lấy từ nó Khi các class lấy từ nó thì bắt buộc phải có đầy đủ các phương thức abstract đã được khai báo trong clas abstract
3 Định nghĩa :
Ø Một astract class thực thi các phương thức tương đối giống nhau với các class con của nó Thêm vào đó nó có thể có thêm các phương thức khác mà các class con đề thực thi chúng các phương thức này được gọi là các phương thức abstract
Ø Một class mà có từ khóa abstract và có nhều hơn một phương thức mà không được thực thi bên trong nó được gọi là abstract class
Ø Trong trường hợp một class mà có nhiều hơn một phương thức không có thân bên trong bạn không thể sư dụng với từ khóa new
Ø Một abstract class không phải là bắt buộc có duy nhất các phương thức abstract .Và các abstract class thì không thể ngăn chặn việc kế
thừa Không thể khóa.4 Sự thực thi:
Ø Một abstract class có thể được thực thi theo cách tương tự class cơ sở bình thường .Các subclass kể thừa từ abstract class có thể nạp chồng và thực thi các method Thêm vào đó các subclass thực thi các phương thức được thực thi với tên và các tham số giống hệt nhau
Ø Nếu các sắp class không thực một trong số các phương thức là abstract trong class abstract thì trình biên diẹc sẽ báo lỗi Chương trình sẽ không thể chạy được
Ví dụ 1 :
Trang 7using System;
using System.Collections.Generic;
using System.Text;
namespace Abstract_Class
{
//Định nghĩa 1 lớp trừu tượng
abstract class NhanVien
{
protected string HoTen;
protected int Tuoi;
protected bool GioiTinh;
}
class Program
{
static void Main(string[] args)
{
NhanVien objPerson = new NhanVien();
}
}
}
5 Các acbtract Method:
Ø Các phương thức được khai báo trong abstract class mà không có thân bên trong được gọi là abstract class Nó được thực thi trong class kế thừa
Ø Tương tự như một quy tắc của phương thức Với một kiểu truy suất , kiểu trả về ,và dâu hiệu một abstract class không có thân và các phương thức được khai báo kết thúc với từ khóa
Ví dụ 2: Định nghĩa 1 lớp trừu tượng có các thuộc tính & phương thức chung cho các lớp dẫn xuất sử dụng
Trang 8o Chúng ta nhận thấy, mối Nhân viên đều có các thuộc tính như: HoTen, Tuoi, GioiTinh Nhưng ChucVu thì khác nhau
o Ví dụ: Giám đốc có ChucVu là Giám đốc, Kế toán có ChucVu là Kế toán
o Nên thuộc tính ChucVu ta khai báo trong lớp dẫn xuất - lớp con/derived class
using System;
using System.Collections.Generic;
using System.Text;
namespace Abstract_Class
{
//Định nghĩa 1 lớp trừu tượng
abstract class NhanVien
{
protected string HoTen;
protected int Tuoi;
protected bool GioiTinh;
//Khai báo 1 phương thức trừu tượng bằng từ khoá abstract
public abstract void CongViec();
}
class Program
{
static void Main(string[] args)
{
}
}
}
Định nghĩa các lớp dẫn xuất GiamDoc và KeToan như sau:
using System;
Trang 9using System.Collections.Generic;
using System.Text;
namespace Abstract_Class
{
//Định nghĩa 1 lớp trừu tượng
abstract class NhanVien
{
public string HoTen;
public int Tuoi;
public bool GioiTinh;
//Khai báo 1 phương thức trừu tượng bằng từ khoá abstract
public abstract void CongViec();
}
//Định nghĩa lớp Dẫn xuất GiamDoc class GiamDoc : NhanVien
{
public string ChucVu;
public override void CongViec()
{
//Code here
}
}
//Định nghĩa lớp Dẫn xuất KeToan
class KeToan : NhanVien
{
public string ChucVu;
public override void CongViec()
{
//Code here
}
}
Trang 10class Program
{
static void Main(string[] args)
{
GiamDoc objGiamDoc = new GiamDoc();
objGiamDoc.HoTen = "Nguyen Van A";
objGiamDoc.Tuoi = 30;
objGiamDoc.GioiTinh = true;
objGiamDoc.ChucVu = "Giam Doc";
System.Console.WriteLine("Lop Dan xuat 'GiamDoc': {0}, {1}, {2}, {3}",
objGiamDoc.HoTen, objGiamDoc.Tuoi, objGiamDoc.GioiTinh, objGiamDoc.ChucVu);
KeToan objKeToan = new KeToan();
objKeToan.HoTen = "Nguyen Van B";
objKeToan.Tuoi = 26;
objKeToan.GioiTinh = true;
objKeToan.ChucVu = "Ke Toan"; System.Console.WriteLine("Lop Dan xuat 'Ke Toan': {0}, {1}, {2}, {3}", objKeToan.HoTen, objKeToan.Tuoi, objKeToan.GioiTinh, objKeToan.ChucVu);
System.Console.ReadLine();
Trang 11} } }
6 Lớp Interface và thực thi nhiều interfaces:
Các subclass trong C# không thể kế thừa nhiều hơn một class Chính bởi điều này C# không
hỗ trợ đa kế thừa Từ hạn chế này interface được giới thiệu Một class trong C# thực thi được nhiều interface
Một vài định nghĩa:
Ø Giao diện (Interface): là một chức năng mà ta
có thể thêm và bất kì class nào Chức năng ở đây không đồng nghĩa với phương thức (hoặc hàm) Interface có thể bao gồm nhiều hàm/phương thức và tất cả chúng cùng phục
vụ cho một chức năng
Ø Như vậy, Interface được dùng để mô tả một
"bản thiết kế" cho một chức năng của class Nếu muốn tạo một bản thiết kế, hãy sử dụng abstract class Một bản thiết kế tất nhiên sẽ có những thứ đã được dựng sẵn và có những thứ
là abstract
Ø Interface không phải là lớp Các lớp dẫn xuất
từ 1 Interface đều phải định nghĩa đầy đủ các phương thức và thuộc tính kế thừa từ Interface
Ø Mục đích của một Interface là để định nghĩa những khả năng mà chúng ta muốn có trong một lớp
Cài đặt một Giao diện:
Ø Để hiểu rõ về Interface hơn, chúng ta tìm hiểu ví dụ sau:
Trang 12Giả sử có 2 lớp: Lớp Máy bay & Lớp Chim Ta thấy Máy bay có chức năng bay Chim cũng có khả năng bay
Ví dụ 1: Tạo Interface: Bay (IBay) cho lớp May bay & Lớp Chim thừa kế
Mã lệnh:
using System;
using System.Collections.Generic;
using System.Text;
namespace Interface
{
//khai bao interface Bay
public interface IBay
{
void Bay();
}
Trang 13//Lớp Chim thừa kế interface IBay
public class Chim : IBay
{
public void Bay()
{
Console.WriteLine("Chim: Bay");
}
}
//Lớp MayBay thừa kế interface IBay
public class MayBay : IBay
{
public void Bay()
{
Console.WriteLine("May Bay: Bay");
}
}
class Program
{
static void Main(string[] args)
{
Chim chim = new Chim();
chim.Bay();
MayBay maybay = new MayBay();
maybay.Bay();
System.Console.ReadLine();
}
}
}
Cài đặt nhiều Giao diện:
Trang 14Trong ngôn ngữ C# cho phép chúng ta thực thi nhiều hơn một giao diện Các giao diện cách nhau bằng dấu phẩy ","
Ở ví dụ trên, chúng ta thấy rằng: Chim & Máy bay đều có khả năng Bay Nhưng đồng thời Chim
& Máy bay cũng có khả năng Chạy Nên ta khai báo thêm 1 Interface Chạy có tên IChay
Ví dụ 2: Cách C# thực thi nhiều giao diện
using System;
using System.Collections.Generic;
using System.Text;
namespace Interface
{
//khai báo interface Bay
public interface IBay
{
void Bay();
}
//khai báo interface Chạy
public interface IChay
{
void Chay();
}
//Lớp Chim thừa kế 2 interfaces IBay, IChay public class Chim : IBay, IChay
{
public void Bay()
{
Console.WriteLine("Chim: Bay");
}
public void Chay()
{
Trang 15Console.WriteLine("Chim: Chay");
}
}
//Lớp MayBay thừa kế 2 interfaces IBay, IChay
public class MayBay : IBay, IChay
{
public void Bay()
{
Console.WriteLine("May Bay: Bay");
}
public void Chay()
{
Console.WriteLine("May Bay: Chay"); }
}
class Program
{
static void Main(string[] args)
{
Chim chim = new Chim();
chim.Bay();
chim.Chay();
MayBay maybay = new MayBay();
maybay.Bay();
maybay.Chay();
System.Console.ReadLine();
}
}
}
7 Định nghĩa dẫn xuất:
Trang 16Một interface chỉ bao gồm duy nhất các thành phần abstract Khác với abstract class một interface không thực thi bất kỳ một phương thức nào Nhưng giống với abstract class là một interace không thể new một đối tượng mới Một interface có thể được thực thi duy nhất từ một class hoặc từ các interface khác
Một interface được khai báo dử dụng từ khóa
“interface” Mặc định các phần tử trong interface
là public với quyền truy suất
Một interface không bao gồm hằng số, biến, destructer, các thành phần static
8 Thực thi interface:
Ø Một thực thi được thực hiện từ một class tương tự việc kế thừa Khi thực hiện việc thực thi một interface trong một cass bạn cần thiết phải thực thi tất cả các thành phần trong interface Nếu tất cả các phần tử không được thực thi chương trình không thể chạy Trình biên dịch sẽ báo lỗi
Ø Các phương thức được thực thi trong các class sẽ với tên và dấu hiệu giống như đã được khai báo trong interface
9 Các interface và việc thực thi nhiều interface:
Ø Nhiều interface có thể được thực thi trong một class đơn Bạn có thể thực thi nhiều interface bằng cách giữa tên các interface bạn thêm vào dấu phẩy
Ø Một class thực thi nhiều interface bắt buộc phải thực hiện toàn bộ các phương thức được khai báo là abstract trong các interface Không cần phải sử dụng từ khóa override
Trang 1710.Thực thi interface một cách rõ ràng:
Một class có thể thực thi các interface một
cách đúng đắn nếu các interface có các phương
thức đặt tên chính xác
11 Interface kế thừa interface:
Một inerface có thể kế thừa nhiều interface
nhưng không có thể thực thi chúng Sự thực thi đó
có thể phải nhờ một class
12 Điểm giống nhau của abstract class và
interface:
Ø Cả hai đều không thể khởi tạo đối tượng
Ø Cả hai đều khai báo các phương thức nhưng
không thực hiện chúng
Ø Cả hai đều bao gồm các phương thức
abstract
Ø Cả hai đều được thực thi từ các class kế thừa
Ø Cả hai đều có thể kế thừa từ nhiều interface
13 Sự khác nhau:
- Có thể kế thừa một class và
nhiều interface
- Một abstract class có thể có
nhiều phương thức có thân bên
trong
- Các phương thức của
abstract class được thực thi sử
dụng từ khóa override
- Là lựa chọn thích hợp khi vừa
khai báo các phương thức
thông thường vừa khai báo các
phương thức abstract
- Chỉ có thể kế thừa nhiều interface
- Không có
- Không cần
- Thích hợp cho việc khai báo duy nhất các phương thức abstract
- Không có
Trang 18- Có thể có hàm khởi tạo và
destructor
14 Cài đặt Giao diện một cách tường minh:
Một lớp có thể cài đặt nhiều giao diện nên có thể xảy ra trường hợp đụng độ về tên khi hai giao diện có cùng một tên hàm Để giải quyết xung đột này ta khai báo cài đặt một cách tường minh hơn
Ví dụ: Nếu ta có hai giao diện IStorable và ITalk đều cùng có phương thức Read () Lớp Document
sẽ cài đặt hai giao diện này Khi đó ta ta phải thêm tên giao diện vào trước tên phương thức
Mã lệnh :
using System;
using System.Collections.Generic;
using System.Text;
namespace Interface_Test
{
interface IStorable
{
void Read();
void Write();
}
interface ITalk
{
void Read();
void Talk();
}
public class Document : IStorable, ITalk
{
// document constructor
public Document(string s)
Trang 19{
Console.WriteLine("Creating document with: {0}", s);
}
// tạo read của IStorable
public virtual void Read()
{
Console.WriteLine("Implementing IStorable.Read");
}
public void Write()
{
Console.WriteLine("Implementing IStorable.Write");
}
// cài đặt phương thức Read của ITalk
void ITalk.Read()
{
Console.WriteLine("Implementing ITalk.Read");
}
public void Talk()
{
Console.WriteLine("Implementing ITalk.Talk");
}
}
class Program
{
static void Main(string[] args)
{
// create a document object
Trang 20Document theDoc = new Document("Test Document");
// Ép kiểu để có thể gọi IStorable.Read()
IStorable isDoc = theDoc as IStorable;
if (isDoc != null)
{
isDoc.Read();
}
// Ép kiểu để có thể gọi ITalk.Read()
ITalk itDoc = theDoc as ITalk;
if (itDoc != null)
{
itDoc.Read();
}
theDoc.Read();
theDoc.Talk();
}
}
}