OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com 1 1 Abstract class & Sealed class Abstract class & Sealed class Lớp trừu tượng lớp dẫn xuất không nhất thiết phải định nghĩa lại phương th
Trang 1OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com 1
1
Abstract class
& Sealed class
Abstract class
& Sealed class
Lớp trừu tượng
lớp dẫn xuất không nhất thiết phải định nghĩa lại phương thức ảo
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
method)
Trang 2OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com 3
Lớp trừu tượng
từ class; VD: abstract class Tau { }
¾Trong phần thân của phương thức trừu
khai báo.
¾Phương thức trừu tượng phải được đặt
trong lớp trừu tượng
Phương thức trừu tượng
trừu tượng (abstract class)
public abstract void TênPhươngThức( );
// hoặc
abstract public void TênPhươngThức( );
Trang 3OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD: minh họa
5
¾Ta xây dựng 3 class:
xuất từ lớp Tau
class Tau
{ public virtual void LayThongtin()
{
Console.WriteLine(“Day la chiec Tau”);
}
}
VD:
class TauChien:Tau
{ public override void LayThongTin()
{
Console.WriteLine(“Day la tau Chien ”); }
}
{ public override void LayThongTin()
{
Console.WriteLine(“Day la tau Cho Hang”); }
}
Trang 4OOP 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();
}
}
VD: minh họa lớp trừu tượng
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 ?
Trang 5OOP 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”);
}
}
VD: Sửa lại VD minh họa trên
abstract class Tau
{
public abstract void LayThongtin();
}
class TauChien:Tau
{ public override void LayThongTin()
{
Console.WriteLine(“Day la tau Chien ”);
}
}
{ public override void LayThongTin()
{
Console.WriteLine(“Day la tau Cho Hang”);
}
} // Error ?
Trang 6OOP 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 ?
Sửa lại cho đúng
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();
}
}
Trang 7OOP 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 ”);
}
}
{ public override void LayThongTin()
{
Console.WriteLine(“Day la tau Cho Hang”);
}
} // Error?
VD: khác trang 57 trong giáo trình
{
}
¾Ta xây dựng 3 class:
xuất từ lớp HinhHoc
Trang 8OOP 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 ;
}
}
Trang 57 trong giáo trình
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; }
}
Trang 9OOP 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());
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() ); }
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
Trang 10OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com 19
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ó
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.
VD 1:
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 ?
Trang 11OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com
VD 2 : sử d ng lớp cô lậ
21
class Program {
static void Main(string[ ] args)
{
SinhVien SinhVien sv = new SinhVien SinhVien();
sv.XemThongTin();
}
} } // Error ?
sealed class SinhVien
{
public void XemThongTin()
{
Console.WriteLine(“Day la sinh vien ”);
}
}
Lớp gốc: (Object class)
cả các kiểu dữ liệu đều được dẫn xuất
(Không cần phải khai báo kế thừa)
ghi đè (override) như bảng sau:
Trang 12OOP 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
đối tượng
từ điển boolEquals(object obj) public virtual So sánh các thực thể của
đối tượng boolEquals(object objA,
objectobjB)
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
đối tượng.
đối tượng
Destructor của Net
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()
{
}
}
Trang 13OOP 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
Q&A