Lp, đối tượng và kiu d liu (type)
Điu ct lõi ca lp trình hướng đối tượng là to ra các kiu mi. Kiu là mt th
được xem như tru tượng. Nó có th là mt bng d liu, mt tiu trình, hay mt
nút lnh trong mt ca s. Tóm li kiu được định nghĩa như mt dng va có thuc
tính chung (properties) và các hành vi ng x (behavior) ca nó.
Nếu trong mt ng dng trên Windows chúng ta to ra ba nút lnh OK, Cancel,
Help, thì thc cht là chúng ta đang dùng ba th hin ca mt kiu nút lnh trong
Windows và các nút này cùng chia x các thuc tính và hành vi chung vi nhau. Ví
d, các nút có các thuc tính như kích thước, v trí, nhãn tên (label), tuy nhiên mi
thuc tính ca mt th hin không nht thiết phi ging nhau, và thường thì chúng khác
nhau, như nút OK có nhãn là “OK”, Cancel có nhãn là “Cancel”...Ngoài ra các nút này
có các hành vi ng x chung như kh năng v, kích hot, đáp ng các thông đip
nhn,…Tùy theo tng chc năng đặc bit riêng ca tng loi thì ni dung ng x khác
nhau, nhưng tt c chúng được xem như là cùng mt kiu.
Cũng như nhiu ngôn ng lp trình hướng đối tượng khác, kiu trong C# được định
nghĩa là mt lp (class), và các th hin riêng ca tng lp được gi là đối tượng
(object). Trong các chương kế tiếp s trình bày các kiu khác nhau ngoài kiu lp như
kiu lit kê, cu trúc và kiu y quyn (delegates).
Quay li chương trình ChaoMung trên, chương trình này ch có mt kiu đơn gin là
lp ChaoMung. Để định nghĩa mt kiu lp trong C# chúng ta phi dùng t khoá class,
tiếp sau là tên lp trong ví d trên tên lp là ChaoMung. Sau đó định nghĩa các thuc
tính và hành động cho lp. Thuc tính và hành động phi nm trong du { }.
Ghi chú: Khai báo lp trong C# không có du ; sau ngoc } cui cùng ca lp. Và
khác
vi lp trong C/C++ là chia thành 2 phn header và phn định nghĩa. Trong C# , định
nghĩa mt lp được gói gn trong du { } sau tên lp và trong cùng mt tp tin.
Phương thc
Hai thành phn chính cu thành mt lp là thuc tính hay tính cht và phương
thc hay còn gi hành động ng x ca đối tượng. Trong C# hành vi được định
nghĩa như mt phương thc thành viên ca lp.
Phương thc chính là các hàm được định nghĩa trong lp. Do đó, ta còn có th
gi các phương thc thành viên là các hàm thành viên trong mt lp. Các phương
thc này ch ra rng các hành động mà lp có th làm được cùng vi cách thc làm
hành động đó. Thông thường, tên ca phương thc thường được đặt theo tên hành
động, ví d như DrawLine() hay GetString().
Tuy nhiên trong ví d 2.1 va trình bày, chúng ta có hàm thành viên là Main() hàm
này là hàm đặc bit, không mô t hành động nào ca lp hết, nó được xác định là hàm
đầu vào ca lp (entry point) và được CRL gi đầu tiên khi thc thi.
Ghi chú: Trong C#, hàm Main() đưc viết ký t hoa đầu, và có th tr v giá tr void
hay int
Khi chương trình thc thi, CLR gi hàm Main() đầu tiên, hàm Main() đầu
vào ca chương trình, và mi chương trình phi có mt hàm Main(). Đôi khi chương
trình có nhiu hàm Main() nhưng lúc này ta phi xác định các ch dn biên dch để
CLR biết đâu là hàm Main() đầu vào duy nht trong chương trình.
Vic khai báo phương thc đưc xem như là mt s giao ước gia người to ra
lp và người s d
ng lp này. Người xây dng các lp cũng có th là người dùng
lp đó, nhưng không hoàn toàn như vy. Vì có th các lp này được xây dng thành
các thư vin chun và cung cp cho các nhóm phát trin khác…Do vy vic tuân th
theo các qui tc lá rt cn thiết.
Để khai báo mt phương thc, phi xác định kiu giá tr tr v, tên ca phương
thc, và cui cùng là các tham s cn thiết cho phương thc thc hin.
Chú thích
Mt chương trình được viết tt thì cn phi có chú thích các đon mã đưc viết. Các
đon chú thích này s không được biên dch và cũng không tham gia vào chương trình.
Mc đích chính là làm cho đon mã ngun rõ ràng và d hiu.
Trong ví d 2.1 có mt dòng chú thích :
// Xuat ra man hinh.
Mt chui chú thích trên mt dòng thì bt đầu bng ký t “//”. Khi trình biên dch gp
hai ký
t này thì s b qua dòng đó.
Ngoài ra C# còn cho phép kiu chú thích cho mt hay nhiu dòng, và ta phi khai báo
“/*” phn đầu chú thích và kết thúc chú thích là ký t “*/”.
Ví d 2.2 : Minh ha dùng chú thích trên nhiu dòng.
-----------------------------------------------------------------------------
class ChaoMung
{
static void Main()
{
/* Xuat ra man hinh chuoi ‘chao mung’
Su dung ham WriteLine cua lop System.Console
*/
System.Console.WriteLine(“Chao Mung”);
}
}
-----------------------------------------------------------------------------
Kết qu:
Chao Mung
-----------------------------------------------------------------------------
Ngoài hai kiu chú thích trên ging trong C/C++ thì C# còn h tr thêm kiu th ba
cũng là kiu cui cùng, kiu này cha các định dng XML nhm xut ra tp tin XML khi
biên dch để to sưu liu cho mã ngun. Chúng ta s bàn kiu này trong các chương trình
các phn tiếp.
ng dng Console
Ví d đơn gin trên được gi là ng dng console, ng dng này giao tiếp vi
người dùng thông quan bàn phím và không có giao din người dùng (UI), ging như
các ng dng thường thy trong Windows. Trong các chương xây dng các ng dng
nâng cao trên Windows hay Web thì ta mi dùng các các giao din đồ ha. Còn để tìm
hiu v ngôn ng C# thun tuý thì cách tt nht là ta viết các ng dng console.
Trong hai ng dng đơn gin trên ta đã dùng phương thc WriteLine() ca lp
Console. Phương thc này s xut ra màn hình dòng lnh hay màn hình DOS chui tham
s đưa vào,
c th là chui “Chao Mung”.
Namespace
Như chúng ta đã biết .NET cung cp mt thư vin các lp đồ s và thư vin này
tên FCL (Framework Class Library). Trong đó Console ch là mt lp nh trong
hàng ngàn lp trong thư vin. Mi lp có mt tên riêng, vy FCL có hàng
ngàn tên như ArrayList, Dictionary, FileSelector,…
Điu này làm ny sinh vn đề, người lp trình không th nào nh hết được tên ca
các lp trong .NET Framework. T hơn na là sau này có th ta to li mt lp trùng
vi lp đã có chng hn. Ví d trong quá trình phát trin mt ng dng ta cn xây
dng mt lp t đin và
ly tên là Dictionary, điu này dn đến s tranh chp khi biên dch vì C# ch cho phép
mt tên duy nht.
Chc chn rng khi đó chúng ta phi đổi tên ca lp t đin mà ta va to thành mt
cái tên khác chng hn như myDictionary. Khi đó s làm cho vic phát trin các ng
dng tr nên phc tp, cng knh. Đến mt s phát trin nht định nào đó thì chính là
cơn ác mng cho nhà phát trin.
Gii pháp để gii quyết vn đề này là vic to ra mt namespace, namsespace s hn
chế phm vi ca mt tên, làm cho tên này ch có ý nghĩa trong vùng đã định nghĩa.
Gi s có mt người nói Tùng là mt k sư, t k sư phi đi kèm vi mt lĩnh vc
nht định nào đó, vì nếu không thì chúng ta s không biết được là anh ta là k sư cu
đường, cơ khí hay phn mm. Khi đó mt lp trình viên C# s bo rng Tùng là
CauDuong.KySu phân bit vi CoKhi.KySu hay PhanMem.KySu. Namespace trong
trường hp này CauDuong, CoKhi, PhanMem s hn chế phm vi ca nhng t
theo sau. Nó to ra mt vùng không gian để tên
sau đó có nghĩa.
Tương t như vy ta c to các namespace để phân thành các vùng cho các lp trùng
tên không tranh chp vi nhau.
Tương t như vy, .NET Framework y dng mt lp Dictionary bên
trong namespace System.Collections, tương ng ta th to mt lp
Dictionary khác nm trong namespace ProgramCSharp.DataStructures, điu này
hoàn toàn không dn đến s tranh chp vi nhau.
Trong ví d minh ha 1.2 đối tượng Console b hn chế bi namespace bng vic s
dng mã lnh:
System.Console.WriteLine();
Toán t ‘.’
Trong víd 2.2 trên du ‘.’ được s dng để truy cp đến phương thc hay d liu
trong mt lp (trong trường hp này phương thc là WriteLine()), và ngăn cách gia
tên lp đến mt namespace xác nhn (namspace System lp Console). Vic
thc hin này theo hướng t trên xung, trong đó mc đầu tiên namespace là System,
tiếp theo là lp Console, và cui cùng là truy cp đến các phương thc hay thuc tính
ca lp.
Trong nhiu trường hp namespace th được chia thành các namespace con
gi là subnamespace. Ví d trong namespace System có cha mt s các
subnamesapce như Configuration, Collections, Data, và còn rt nhiu na, hơn na
trong namespace Collection còn chia thành nhiu namesapce con na.
Namespace giúp chúng ta t chc và ngăn cách nhng kiu. Khi chúng ta viết
mt chương trình C# phc tp, chúng ta có th phi to mt kiến trúc namespace riêng
cho mình, không gii hn chiu sâu ca cây phân cp namespace. Mc đích ca
namespace giúp chúng ta chia để qun lý nhng kiến trúc đối tượng phc tp.
T khóa using
Để làm cho chương trình gn hơn, và không cn phi viết tng namespace cho tng
đối tượng, C# cung cp t khóa là using, sau t khóa này là mt namespace hay
subnamespace vi mô t đầy đủ trong cu trúc phân cp ca nó. Ta có th dùng dòng lnh :
using System;
đầu chương trình và khi đó trong chương trình nếu chúng ta có dùng đối tượng Console
thì không cn phi viết đầy đủ : System.Console. mà ch cn viết Console. thôi.
Ví d 2.3: Dùng khóa using
-----------------------------------------------------------------------------
using System;
class ChaoMung
{
static void Main()
{
//Xuat ra man hinh chuoi thong bao
Console.WriteLine(“Chao Mung”);
}
}
-----------------------------------------------------------------------------
Kết qu:
Chao Mung