Lớp trừu tượng và lớp bị khóa

¾Trong phương th Trong phương thức ảo (virtual method):

lớp dẫn xuất không nhất thiết phải đ i định

nghĩa lại phương th i phương thức ảo

¾Trong lớp trừu tư u tượng (abstract class): Để

bắt buộctất cảcác lớp dẫn xuất phải đ i định

nghĩa lại (override) phương th phương thức của lớp

cơs cơsởvàphương th phương thức đ c đó đư được gọi là

phương trừu tượng (abstract method)

pdf13 trang | Chuyên mục: Visual C# | Chia sẻ: dkS00TYs | Lượt xem: 1646 | Lượt tải: 1download
Tóm tắt nội dung Lớp trừu tượng và lớp bị khóa, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com1
Lớp trừu tượng và Lớp bị khóa
1
Abstract class
& Sealed class
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com2
Lớp trừu tượng
¾Trong phương thức ảo (virtual method): 
lớp dẫn xuất không nhất thiết phải định 
nghĩa lại phương thức ảo
¾Trong lớp trừu tượng (abstract class): Để
bắt buộc tất cả các lớp dẫn xuất phải định 
nghĩa lại (override) phương thức của lớp 
cơ sở và phương thức đó được gọi là 
phương thức trừu tượng (abstract 
method)
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com3
Lớp trừu tượng
¾Lớp trừu tượng có từ khóa abstract trước 
từ class; VD: abstract class Tau { }
¾Trong phần thân của phương thức trừu 
tượng không có câu lệnh nào (chỉ xây 
dựng khuôn mẫu), tức là nó chỉ có phần 
khai báo.
¾Phương thức trừu tượng phải được đặt 
trong lớp trừu tượng
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com4
Phương thức trừu tượng 
¾Không thể tạo ra đối tượng (new) từ lớp 
trừu tượng (abstract class)
¾Cú pháp phương thức trừu tượng:
public abstract void TênPhươngThức( ); 
// hoặc
abstract public void TênPhươngThức( );
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD: minh họa
5
¾Ta xây dựng 3 class: 
9Lớp Tau là lớp cơ sở
9Lớp TauChien và TauChoHang là lớp dẫn 
xuất từ lớp Tau
class Tau
{ public virtual void LayThongtin()
{
Console.WriteLine(“Day la chiec Tau”);
}
}
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD:
6
class TauChien:Tau 
{ public override void LayThongTin()
{
Console.WriteLine(“Day la tau Chien ”);
}
}
class TauChoHang:Tau 
{ public override void LayThongTin() 
{
Console.WriteLine(“Day la tau Cho Hang”);
}
}
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD: thể hiện tính đa hình
7
class Program {
static void Main(string[] args)
{
Tau [ ] t = new Tau[3];
t[0] = new Tau();
t[1] = new TauChien();
t[2] = new TauChoHang();
for(int i=0; i<3; i++)
t[i].LayThongTin();
}
} 
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD: minh họa lớp trừu tượng
8
class Tau
{ public abstract void LayThongtin()
{
Console.WriteLine(“Day la chiec Tau”);
}
}
class TauChien:Tau 
{ public override void LayThongTin()
{
Console.WriteLine(“Day la tau Chien ”);
}
}
class TauChoHang:Tau 
{ public override void LayThongTin() 
{
Console.WriteLine(“Day la tau Cho Hang”);
}
} // Error ?
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD: minh họa
9
class TauChien:Tau 
{ public override void LayThongTin()
{
Console.WriteLine(“Day la tau Chien ”);
}
}
class TauChoHang:Tau 
{ public override void LayThongTin() 
{
Console.WriteLine(“Day la tau Cho Hang”);
}
} // Error ?
abstract class Tau
{ public abstract void LayThongtin()
{
Console.WriteLine(“Day la chiec Tau”);
}
}
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD: Sửa lại VD minh họa trên
10
abstract class Tau
{
public abstract void LayThongtin();
}
class TauChien:Tau 
{ public override void LayThongTin()
{
Console.WriteLine(“Day la tau Chien ”);
}
}
class TauChoHang:Tau 
{ public override void LayThongTin() 
{
Console.WriteLine(“Day la tau Cho Hang”);
}
} // Error ?
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD: thể hiện tính đa hình
11
class Program {
static void Main(string[] args)
{
Tau [] t = new Tau[3];
t[0] = new Tau();
t[1] = new TauChien();
t[2] = new TauChoHang();
for(int i=0; i<3; i++)
t[i].LayThongTin();
}
} // Are there any error ? Which line do you get error ?
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
Sửa lại cho đúng
12
class Program {
static void Main(string[] args)
{
Tau [] t = new Tau[3];
t[0] = new TauChien();
t[1] = new TauChien();
t[2] = new TauChoHang();
for(int i=0; i<3; i++)
t[i].LayThongTin();
}
} 
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
Giả sử ta không xây dựng method LayThongTin trong lớp TauChien
13
abstract class Tau
{ abstract public void LayThongtin(); }
class TauChien:Tau 
{ public override void LayThongTin()
{
Console.WriteLine(“Day la tau Chien ”);
} 
}
class TauChoHang:Tau 
{ public override void LayThongTin() 
{
Console.WriteLine(“Day la tau Cho Hang”);
}
} // Error?
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD: khác trang 57 trong giáo trình
14
abstract public class HinhHoc
{
abstract public double DienTich();
public virtual double ChuVi() { return 0 } ;
}
¾Ta xây dựng 3 class: 
9Lớp HinhHoc là lớp cơ sở
9Lớp HinhTron và HinhChuNhat là lớp dẫn 
xuất từ lớp HinhHoc
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD: khác trang 57 trong giáo trình
15
class HinhTron : HinhHoc 
{ double _bankinh; 
public double BanKinh 
{ 
get { return _bankinh; } 
set { _bankinh = value; } 
} 
public override double DienTich() 
{
return _bankinh*_bankinh*3.14 ; 
} 
public override double ChuVi() 
{ 
return _bankinh*2*3.14 ; 
}
}
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
Trang 57 trong giáo trình
16
Class HinhChuNhat : HinhHoc 
{ double _dai, _rong; 
public double ChieuDai 
{ get { return _dai; } 
set { _dai = value; }
} 
public double ChieuRong 
{ get { return _rong; } 
set { _rong = value; } 
} 
public override double DienTich()
{ return _dai*_rong; }
public override double ChuVi()
{ return (_dai+_rong)*2; }
}
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
Trang 58 trong giáo trình
17
static void Main(string[ ] args)
{ HinhHoc h;
HinhTron t = new HinhTron();
t.BanKinh = 5;
Console.WriteLine("\nTHONG TIN HINH TRON");
h = t;
Console.WriteLine("Chu vi hinh tron: {0} ", h.ChuVi());
Console.WriteLine("Dien tich hinh tron:{0} \n", h.DienTich());
HinhChuNhat n = new HinhChuNhat();
n.ChieuDai = 4;
n.ChieuRong = 3;
h = n;
Console.WriteLine("\nTHONG TIN HINH CHU NHAT");
Console.WriteLine("Chu vi hinh chu nhat:{0}", h.ChuVi() );
Console.WriteLine("Dien tich hinh chu nhat:{0}", h.DienTich() );
} 
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com18
Ghi chú:
Phân biệt giữa từ khóa new và override
¾Từ khóa override dùng để định nghĩa lại (ghi 
đè) phương thức ảo (virtual) hoặc phương 
thức trừu tượng (abstract) của lớp cơ sở, nó 
được dùng với mục đích đa hình. 
¾Từ khóa new để che dấu thành viên của lớp 
cơ sở trùng tên với thành viên của lớp dẫn 
xuất. 
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com19
Lớp cô lập (sealed class)
¾Lớp cô lập là lớp không cho các lớp khác kế
thừa từ nó
¾Cú pháp:
sealed class TênLớp
{
// Class members here. 
}
¾Việc sử dụng và tạo các đối tượng theo từ
khóa new bình thường như các lớp khác.
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD 1:
20
Sealed class Tau
{
public void LayThongTin() 
{
Console.WriteLine(“Day la tau chiec tau ”);
}
}
class TauChoHang : Tau 
{ public override void LayThongTin() 
{
Console.WriteLine(“Day la tau Cho Hang”);
}
} // Error ?
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD 2 : sử dụng lớp cô lập
21
class Program {
static void Main(string[ ] args)
{
SinhVien sv = new SinhVien();
sv.XemThongTin();
}
} } // Error ?
sealed class SinhVien
{
public void XemThongTin() 
{
Console.WriteLine(“Day la sinh vien ”);
}
}
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com22
Lớp gốc: (Object class)
¾Tất cả các lớp của ngôn ngữ C# và tất 
cả các kiểu dữ liệu đều được dẫn xuất 
ngầm định từ lớp System.Object 
(Không cần phải khai báo kế thừa)
¾Lớp Object là lớp gốc trên cây phân 
cấp kế thừa, nó cung cấp một số 
phương thức mà các lớp con có thể
ghi đè (override) như bảng sau:
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
Bảng tóm tắt phương thức của lớp Object
23
Phương thức Bổ từ truy cập Chức năng
string ToString() public virtual Trả về một chuỗi mô tả của 
đối tượng
int GetHashTable() public virtual Được sử dụng nếu thi hành 
từ điển
bool Equals(object obj) public virtual So sánh các thực thể của 
đối tượng
bool Equals(object objA,
object objB) 
public static So sánh các thực thể của 
đối tượng
bool ReferenceEquals(object
objA, object objB) 
public static So sánh hai sự tham khảo 
đến một đối tượng
Type GetType() public Trả về chi tiết kiểu của một 
đối tượng.
object MemberwiseClone() protected tạo ra một bản copy của 
đối tượng
void Finalize() protected virtual Đây là một dạng 
Destructor của .Net
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD: minh họa lớp Object
public class Xe
{ // biến thành viên private lưu giá trị
private int _NhienLieu;
public Xe(int nhienlieu)
{
_NhienLieu = nhienlieu;
}
// ghi đè phương thức ToString của lớp Object 
public override string ToString()
{
return _NhienLieu.ToString();
}
}
24
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD: minh họa lớp Object
public class Tester
{
static void Main(string[ ] args)
{
int i = 5;
Console.WriteLine(“Gia tri cua i la:: {0}”, i.ToString() ); 
Xe x = new Xe(7); 
Console.WriteLine(“Nhien lieu cua Xe la: {0}”, x.ToString() );
Console.WriteLine(“Gia tri cua 5 la: {0}”, 5.ToString() );
Console.ReadLine();
}
} // Display?
Trong lớp Object phương thức ToString() được khai báo?
public virtual string ToString();
25
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
Q&A

File đính kèm:

  • pdf05_Abstract_Sealed.pdf