4/10/2012
1
Chương 3
Xây dựng lớp, đối tượng
ThS. Phạm Thanh An
Khoa Công nghệ thông tin
Đại học Ngân hàng Tp. Hồ Chí Minh
Nội dung trình bày
Định nghĩa lớp.
Tạo đối tượng.
Sử dụng các thành viên static.
Hủy đối tượng.
Truyền tham số.
Nạp chồng phương thức.
Đóng gói dữ liệu với thuộc tính.
Thuộc tính chỉ đọc.
Phát triển hệ thống OOP
Chương trình được tạo thành bởi các đối
tượng.
Mỗi đối tượng đảm nhận thực hiện một tập các
nhiệm vụ liên quan.
Trong phát triển hệ thống, đối tượng là sự mô
tả một cái gì đó mà chúng ta muốn thao tác
trong hệ thống: là thực thể vật lý hoặc thực thể
khái niệm
Đối tượng có các thuộc tính (property) và hành
vi (behaviors)
4/10/2012
2
Đối tượng
Sinh viên:
Thuộc tính:
Tên
Mã số sinh viên
Ngày sinh
Quê quán
Hành vi
Đăng ký môn học
Chọn chuyên ngành
Hủy một môn học
Đối tượng (tt)
Đối tượng có thể biểu diễn cho người, vị trí,
vật, một bảng dữ liệu cần xử lý
Xe hơi : là một thực thể vật lý
Tài khoản khách hàng: thực thể khái niệm
Khoa: thực thể khái niệm
Các đối tượng tương tác bằng cách gửi thống
điệp (sending message)
sending message = calling method
Lớp
Lớp là bản mẫu hay một kiểu chung cho
tất cả những đối tượng có những đặc
trưng giống nhau
có các thuộc tính và hành vi giống nhau
Trong lập trình hướng đối tượng, lớp
được xem là đồng nhất với kiểu dữ liệu
trừu tượng
Một lớp có thể tạo ra một số không giới
hạn các đối tượng
4/10/2012
3
Lớp (tt)
Tên
Địa chỉ
Điện thoại
Thanh
Quận 1
123-456
Bình
Quận 2
221-4728
Lan
Quận 9
117-2321
Khách hàng
Tên
Địa chỉ
Điện thoai
Lớp với đối tượng
Lớp Đối tượng
Là khuôn mẫu
Định nghĩa các thuộc
tính và hành động của
một đối tượng
Được tạo ra khi thiết
kế
Là một thể hiện của một
lớp, đối tượng tồn tại
trong bộ nhớ và có thời
gian tồn tại hữu hạn
(finite lifespan)
245
Định nghĩa lớp
Sử dụng từ khoá class.
[Bổ từ truy cập] class <tên lớp> [: Lớp cơ sở]
{
<Khai báo các thuộc tính> // Các thành phần dữ
liệu
<Khai báo các phương thức> // Hàm
}
Ghi chú: trong C# phần kết thúc của lớp không
có dấu “;” như khai báo lớp trong ngôn ngữ C++
4/10/2012
4
Ví dụ về định nghĩa lớp
public class hocsinh
{
private string hoten;
public int lop ;
public void lenlop();
{
lop = lop +1;
}
} // kết thúc khai báo lớp
Ví dụ: Lớp tài khoản
public class taikhoan
{
private float sodutk ;
public void naptien(float sotien)
{ sodutk = sodutk + sotien; }
public bool ruttien(float sotien)
{ if ( sodutk < sotien) return false ;
else { sodutk = sodutk - tienrut; return true ; }
}
public float laysodu()
{ return sodutk ; }
}
Bổ từ truy cập (Access modifiers)
Bổ từ truy
cập
Giới hạn truy cập
public Không giới hạn. Những thành phần public có thể được dùng
bởi bất cứ các phương thức của lớp bất kỳ.
private Thành viên trong một lớp A được đánh dấu là private thì chỉ
có thể được truy cập bởi các phương thức của lớp A.
protected
Thành viên trong lớp A được đánh dấu là protected thì chỉ có
thể được truy cập các phương thức bên trong lớp A và những
phương thức của những lớp dẫn xuất từ lớp A .
4/10/2012
5
Bổ từ truy cập (Access modifiers)
Bổ từ truy
cập
Giới hạn truy cập
internal
Thành viên trong lớp A được đánh dấu là internal thì được
truy cập bởi những phương thức của bất cứ lớp nào trong
cùng khối hợp ngữ với A.
protected
internal
Thành viên trong lớp A được đánh dấu là protected
internal được truy cập bởi các phương thức của lớp A, các
phương thức của lớp dẫn xuất của A, và bất cứ lớp nào
trong cùng khối hợp ngữ của A.
Phương thức
Là các hàm khai báo bên trong lớp
Có trả về giá trị (int, float, string, object, vv)
Hoặc không trả về giá trị (void)
Một phương thức cài đặt hành vi của đối
tượng
Khai báo phương thức
<Bổ từ truy cập> <kiểu trả về> <tên phương thức> (d/s tham số)
{
< câu lệnh> ; // thân phương thức
}
Tham số của phương thức
Có thể có 0 hoặc nhiều tham số.
Mỗi tham số phải khai báo kèm với kiểu dữ
liệu
Bên trong thân của phương thức,
Các tham số này được xem như những biến cục
bộ
Giống như biến ta khai báo bên trong phương thức
và khởi tạo giá trị bằng giá trị của tham số truyền
vào
4/10/2012
6
Tạo đối tượng
Sử dụng từ khóa new
Đối tượng = new tênlớp()
Ví dụ:
taikhoan tk1 = new taikhoan();
hoặc taikhoan tk1 ; tk1 = new taikhoan();
Truy cập đến thành phần
<đối tượng>.<thành phần>
Ví dụ: lớp thời gian
using System;
public class ThoiGian
{
int Nam;
int Thang;
int Ngay; // Các thành viên private
int Gio;
int Phut;
int Giay;
public void ThoiGianHienHanh()
{
Console.WriteLine(“Hien thi thoi gian hien hanh”);
}
}
Ví dụ: lớp thời gian
public class Tester
{
static void Main()
{
ThoiGian t = new ThoiGian();
t.ThoiGianHienHanh();
}
}
4/10/2012
7
Phương thức thiết lập (constructor)
Là một phương thức đặc biệt trong một lớp
Được gọi mỗi khi đối tượng được tạo
Không bắt buộc phải có, nhưng hữu ích cho
việc khởi tạo các thành phần của đối tượng
Có cùng tên với tên lớp, được khai báo là
public, không trả về giá trị (không sử dụng
void)
Khi đó tạo đối tượng:
đối tượng = new tênlớp(các tham số)
Ví dụ: Phương thức thiết lập
using System;
public class Thang
{
private int days;
public Thang(int songay)
{
days = songay;
}
static void Main()
{
Thang thang1 =new Thang(31);
Thang thang4 = new Thang(30);
Console.WriteLine (Thang1.days);
}
}
Ví dụ: lớp Rectangle
4/10/2012
8
Phương thức thiết lập (tt)
Nếu không định nghĩa phương thức thiết
lập, trình biên dịch sẽ cung cấp một
phương thức thiết lập mặc định.
Phương thức thiết lập mặc định được
tạo ra cho một đối tượng sẽ không thực
hiện bất cứ hành động nào
Các thành viên lớp được khởi tạo các
giá trị mặc định.
Giá trị mặc định kiểu dữ liệu cơ bản
Ví dụ:
class MyClass
{
string myMsg;
public MyClass (string msg)
{
myMsg = msg;
}
}
class MyApp
{
MyClass c;
public Main (string[] args)
{
c = new MyClass(); // Lỗi
}
}
4/10/2012
9
Ví dụ: lớp Time
using System;
using System.Collections.Generic;
using System.Text;
namespace DeclaringConstructor
{
public class Time
{
int Year;
int Month;
int Date; // private member variables
int Hour;
int Minute;
int Second;
Ví dụ: lớp Time (tt)
public void DisplayCurrentTime( )
{
System.Console.WriteLine( "{0}/{1}/{2}
{3}:{4}:{5}", Month, Date, Year, Hour, Minute,
Second );
}
// phương thức thiết lập
public Time( System.DateTime dt )
{ Year = dt.Year; Month = dt.Month; Date =
dt.Day; Hour = dt.Hour; Minute = dt.Minute;
Second = dt.Second;
}
} // end class Time
Ví dụ: lớp Time (tt)
public class Kiemtra
{
static void Main( )
{
System.DateTime currentTime =System.DateTime.Now;
Time t = new Time( currentTime );
t.DisplayCurrentTime( );
}
}
} // end namespace
4/10/2012
10
Khởi tạo biến thành viên
Các biến thành viên có thể được khởi
tạo trực tiếp khi khai báo trong quá trình
khởi tạo
private int Giay = 30; // Khởi tạo
Nạp chồng phương thức thiết lập
Chúng ta có thể định nghĩa nhiều
phương thức thiết lập trong một lớp
Với điều kiện
Danh sách các tham số phải khác nhau
Hoặc kiểu dữ liệu các các tham số phải
khác nhau.
Ví dụ
public class taikhoan
{
private float sodutk ;
private float gioihanrut;
public taikhoan( int sd)
{
sodutk = sd;
}
public taikhoan (int sd, int lm)
{
sodutk = sd;
gioihanrut = lm;
}
4/10/2012
11
Ví dụ
public void naptien(float sotiennap)
{
sodutk = sodutk + sotiennap;
}
public bool ruttien(float sotienrut)
{
if (sotienrut <=sodutk)
{ sodutk = sodutk - sotienrut; return
true;}
else return false ;
}
}
Ví dụ
taikhoan tk1 = new taikhoan(50);
taikhoan tk2 = new taikhoan(50,10);
Ví dụ : Nạp chồng constructor
4/10/2012
12
Ví dụ:
…
public class DaysInYear
{
private int days;
public DaysInYear()
{
days = 365;
}
public DaysInYear(int day)
{
days = day;
}
public DaysInYear(String dayOne)
{
days =Convert.ToInt32(dayOne);
}
public void setDay(int newDays)
{
days = newDays;
}
…
}
Phương thức thiết lập sao chép
Để thực hiện việc tạo một đối tượng mới bằng cách
sao chép tất cả các biến từ một đối tượng đã có và
cùng một kiểu dữ liệu.
public ThoiGian( ThoiGian tg)
{
Nam = tg.Nam;
Thang = tg.Thang;
Ngay = tg.Ngay;
Gio = tg.Gio;
Phut = tg.Phut;
Giay = tg.Giay;
}
Phương thức thiết lập sao chép (tt)
Để sao chép từ một đối tượng đã hiện
hữu t1 là đối tượng của lớp ThoiGian
như sau:
ThoiGian t2 = new ThoiGian( t1 );
Lúc đó, đối tượng t2 được tạo ra như bản
sao của đối tượng t1.
4/10/2012
13
Từ khóa this
Từ khóa this được dùng để tham chiếu đến
thể hiện hiện hành của một đối tượng.
Được sử dụng để giải quyết sự xung đột về
tên
Mỗi phương thức có thể tham chiếu đến
những phương thức khác và các biến thành
viên thông qua tham chiếu this này
Không thể sử dụng từ khóa this với các biến
và phương thức tĩnh.
Từ khóa this (tt)
Sử dụng khi các biến thành viên bị che lấp bởi
tham số đưa vào, như trường hợp sau
public void SetYear( int Nam)
{
this.Nam = Nam;
}
Trong phương thức SetYear() có tham số
(Nam) cùng tên với thành phần của lớp.
Từ khóa this (tt)
Sử dụng tham chiếu this để gọi một phương thức nạp
chồng từ một phương thiết lập khác :
class myClass {
public myClass(int i)
{
}
public myClass( ) : this(42)
{
}
} // end class
4/10/2012
14
Từ khóa this (tt)
Sử dụng this để gọi tường minh các
thành phần và phương thức trong lớp
public void MyMethod(int y)
{
int x = 0;
x = 7; // gán biến cục bộ
y = 8; // gán cho tham số
this.z = 5; // gán cho thành phần lớp
this.Draw( ); // gọi phương thức thành phần
}
Các thành viên tĩnh (static member)
Những thuộc tính và phương thức trong một
lớp có thể là những thành viên thể hiện
(instance members) hay những thành viên tĩnh
(static members).
Những thành viên thể hiện hay thành viên của đối
tượng, liên quan đến 1 thể hiện của lớp (một đối
tượng).
Trong khi thành viên tĩnh được xem như một phần
của lớp
Các thành viên tĩnh (tt)
Để truy cập đến thành viên tĩnh của một
lớp: <Tên lớp>.<tên thành phần tĩnh>
Sử dụng từ khóa “static” để khai báo
một thuộc tính hay một phương thức với
thuộc về lớp
4/10/2012
15
Ví dụ: Phương thức tĩnh
Các thành viên tĩnh (tt)
Chỉ có một bản sao của các thành phần tĩnh
trong bộ nhớ, được chia sẽ bởi các thể hiển
của lớp.
Ghi chú:
Trong C# không cho phép truy cập đến các thành
viên tĩnh thông qua một thể hiện,
Nếu chúng ta cố làm điều đó thì trình biên dịch
C# sẽ báo lỗi
Ví dụ: thành viên tĩnh
public class Counter
{
private Counter() { }
public static int currentCount;
public static int IncrementCount()
{
return ++currentCount;
}
}
4/10/2012
16
Ví dụ: thành viên tĩnh (tt)
class TestCounter
{
static void Main()
{
Counter.currentCount = 100;
Counter.IncrementCount();
System.Console.WriteLine("New count: {0}",
Counter.currentCount);
}
}
Các thành viên tĩnh (tt)
Các thuộc tính tĩnh rất hữu ích khi chúng
ta muôn lưu trữ các trạng thái liên quan
đến tất cả thể hiện của lớp
Phương thức tĩnh có tác dụng khi hành
vi là chung cho của lớp chứ không phải
một thể hiện cụ thể nào của lớp.
Ví dụ sử dụng các thuộc tính tĩnh
using System;
public class Cat
{
private static int instance =0;
public Cat()
{
instance++;
}
public static void HowManyCats()
{
Console.WriteLine(“{0} cats”, instance);
}
}
4/10/2012
17
Ví dụ sử dụng các thuộc tính tĩnh
public class Tester
{
static void Main()
{
Cat.HowManyCats();
Cat mun = new Cat();
Cat.HowManyCats();
Cat muop = new Cat();
Cat miu = new Cat();
Cat.HowManyCats();
}
}
Kết quả:
0 cats
1 cats
3 cats
Gọi một phương thức tĩnh
Main() là một phương thức tĩnh.
Các phương thức tĩnh không cần có tham
chiếu this và một thể hiện nào tham chiếu tới.
Các phương thức tĩnh không thể truy cập trực
tiếp đến các thành phần không tĩnh (nonstatic)
Ví dụ với Main() để gọi một phương thức không tĩnh
(nonstatic), phải tạo ra một thể hiện lớp
Ví dụ:
using System;
public class Class1
{
public void SomeMethod(int p1, float p2)
{ Console.WriteLine(“Ham nhan duoc hai tham so: {0} va {1}”, p1,p2); }
}
public class Tester
{
static void Main()
{
int var1 = 5;
float var2 = 10.5f;
Class1 c = new Class1();
c.SomeMethod( var1, var2 );
}
}
4/10/2012
18
Phương thức thiết lập tĩnh
Nếu một lớp khai báo một phương thức thiết lập
tĩnh (static constructor), thì phương thức thiết lập
tĩnh này sẽ được thực hiện trước bất cứ thể hiện
nào của lớp được tạo ra.
Ghi chú:
Không thể điều khiển chính xác khi nào thì phương
thức thiết lập tĩnh này được thực hiện.
Nó sẽ được thực hiện sau khi chương trình chạy và
trước bất kì biến đối tượng nào được tạo ra.
Ví dụ: Sử dụng hàm thiết lập tĩnh
class A
{
public static int x;
static A ( )
{
x = 0;
}
public void Increase()
{
x = x+1;
}
}
Sử dụng phương thức
thiết lập tĩnh để khởi đầu
các biến thành phần tĩnh
Lưu ý về phương thức thiết lập tĩnh
1 lớp có thể định nghĩa duy nhất một phương
thức thiết lập tĩnh
Phương thức thiết lập tĩnh thưc hiện duy nhất
1 lần cho dù chúng ta có tao ra một số bất kỳ
các đối tượng
Phương thức thiết lập tĩnh không nhận bổ từ
truy cập (private, public, ) và không nhận bất
kỳ tham số nào.
Phương thức thiết lập tĩnh được thực hiện
trước bất kỳ phương thức thiết lập mức thể
hiện.
4/10/2012
19
Phương thức thiết lập private
Được sử dụng khi một lớp chỉ có các
thành phần tĩnh, và đối tượng của lớp
không cần tạo ra
Phương thức thiết lập private (tt)
C# không có phương thức toàn cục và hằng số toàn
cục (đều phải khai báo trong 1 lớp).
Sử dụng phương thức thiết lập private,khi cần tạo ra
những lớp tiện ích nhỏ chỉ để chứa các phương thức
tĩnh (lớp Math, Console)
Lưu ý:
Nếu một lớp có phương thức thiết lập private và
không có phương thức thiết lập public, thì tất cả
các lớp khác (ngoại trừ lớp lồng) không được phép
tạo ra thể hiện của lớp này.
Phương thức hủy (Destructors)
Không nhận tham số
Khai báo như phương thức thiết lập, có thêm ‘~’ vào
trước
Được gọi bởi Garbage Collector trong C#
Garbage Collector giải phóng bộ nhớ bằng cách hủy
những đối tượng không dùng nữa hoặc không tham
chiếu đến nữa
Cú pháp:
…
~<Tên lớp>()
{
<câu lệnh> ;
}
…
4/10/2012
20
Phương thức hủy (Destructors)
Lưu ý:
Có duy nhất 1 phương thức hủy trong 1 lớp
Không thể gọi tường minh phương thức hủy
Không nhận bất kỳ tham số nào
Khổng thể nạp chồng hay kế thừa
Không nhân các bổ từ truy cập
Ví dụ: phương thức hủy
Truyền tham số
Mặc định, các kiểu giá trị thì sẽ được
truyền giá trị vào cho phương thức.
C# đưa ra khả năng cho phép ta truyền
các tham số kiểu giá trị dưới hình thức là
tham chiếu, sử dụng các bổ từ:
ref : Bắt buộc phải khởi tạo giá trị ban đầu
cho tham số truyền vào
out: Không cần phải khởi tạo giá trị ban
đầu cho tham số truyền vào.
4/10/2012
21
Ví dụ: Truyền tham số
Ví dụ: với bổ từ ref
Ví dụ: với bổ từ out
4/10/2012
22
Từ khóa params
using System;
using System.Collections.Generic;
using System.Text;
namespace UsingParams
{
public class Tester
{
static void Main( )
{
Tester t = new Tester( );
t.DisplayVals(5,6,7,8);
int [ ] mang = new int[5] {1,2,3,4,5};
t.DisplayVals(mang);
}
Từ khóa params (tt)
public void DisplayVals(params int[] intVals)
{
foreach (int i in intVals)
{
Console.WriteLine("DisplayVals {0}",i);
}
}
} // kết thúc lớp
} // kết thúc namespcae
Quá tải phương thức (Overloading)
Sử dụng cùng một tên cho các phương
thức
Có hai cách quá tải phương tức
Chỉ ra số các tham số khác nhau
Chỉ ra kiểu của các tham số khác nhau
4/10/2012
23
Quá tải phương thức
using System;
public class Area
{
private int areaVal;
public void AreaCal(int radius)
{
areaVal = (22/7)* radius*radius;
}
public void AreaCal(int length, int breadth)
{
areaVal = length*breadth;
}
public void AreaCal(int length, int breadth, int height)
{
areaVal = length*breadth*height;
}
…
}
Quá tải phương thức
public void Add(int number1, int number2)
{
sum = number1 + number2;
}
public void Add(string value1, string value2)
{
int sum;
sum = Int32.Parse(value1) + Int32.Parse(value2);
Console.WriteLine ("Sum is {0}",sum);
Console.WriteLine ("Strings are converted to integers to add”);
}
Đóng gói dữ liệu với thuộc tính
C# cung cấp khả năng bảo vệ các trường dữ
liệu trong một lớp, tránh truy cập trực tiếp
bằng cách đọc và ghi tới các trường này thông
qua Properties
Properties được thiết kế nhắm vào hai mục
đích:
Cung cấp một giao diện đơn cho phép truy cập các
biến thành viên.
Tuy nhiên cách thức thực thi truy cập giống như
phương thức trong đó các dữ liệu được che dấu,
đảm bảo cho yêu cầu thiết kế hướng đối tượng
4/10/2012
24
Đóng gói dữ liệu với thuộc tính
public class Employee
{
private string fullName;
public string GetFullName()
{
return fullName;
}
public void SetFullName (string s)
{
fullName = s;
}
}
Sử dụng các phương
thức để truy cấp đến
trường private,
phương pháp truyền
thống
Đóng gói dữ liệu với thuộc tính
<Bổ từ truy cập> có thể là private, public,
protected hay internal, <Kiểu trả về> có thể
bất kỳ 1 kiểu trong C#.
< Bổ từ truy cập > <Kiểu trả về> <Tên Property>
{
get
{
}
set
{
}
}
Đóng gói dữ liệu với thuộc tính
public class Employee
{
private string fullName;
// Property for fullName
public string Name
{
get { return fullName; }
set { fullName = value;}
}
}
Định nghĩa Property để
cho các chương trình
client truy cập
static void Main()
{
Employee p = new
Employee();
p.Name = “Tom”;
Console.WriteLine (p.Name);
}
4/10/2012
25
Đóng gói dữ liệu với thuộc tính
Các kiểu thuộc tính
Read/Write
Read-Only
Write-Only
Read/Write Property
Tồn tại cả hai khối get và set
Read-Only Property
Chỉ tồn tại khối get
public class Employee
{
private string fullName;
// read-only Property for fullName
public string Name
{
get { return fullName; }
}
}