Xõy dựng lớp

Một phần của tài liệu Giáo trình lập trình windowns form với c net tập 1 TS lê trung hiếu, ths nguyễn thị minh thi (Trang 105)

Lớp là một cấu trỳc dữ liệu nhưng bao gồm dữ liệu và cỏc

phương thức thao tỏc trờn dữ liệu đú. Lớp định nghĩa kiểu dữ liệu

mới, dựng để tạo đối tượng thuộc kiểu lớp đú.

Khi định nghĩa một lớp, bạn chỉ ra thuộc tớnh (fields) của lớp được thể hiện bằng biến gọi là biến thành viờn (member variable) và

hành vi được thể hiện bởi mó lệnh trong phương thức (method), thuộc

tớnh (property), sự kiện (event), chỉ mục (indexer) và tham chiếu phương thức (delegate). Trong hầu hết cỏc lớp, cỏc biến thành viờn

được truy cập bởi cỏc phương thức của lớp đú. Vỡ vậy, chớnh cỏc phương thức quyết định dữ liệu của lớp cú thể dựng như thế nào.

Dạng đầy đủ của một định nghĩa lớp như sau:

[public/internal]

Lớp được truy xuất chung cho

cỏc gúi khỏc, nếu khụng cú

public, mặc định là internal, chỉ được truy xuất trong nội bộ một

assembly.

[static]

Lớp tĩnh chỉ chứa thành viờn tĩnh. Khụng thể khởi tạo đối tượng của lớp tĩnh bởi toỏn tử

new. Lớp tĩnh là lớp hằng

[abstract] Lớp trừu tượng, khụng thể khởi

tạo đối tượng

[sealed] Lớp hằng khụng cú lớp con

[partial] Phõn tỏch định nghĩa lớp vào

nhiều tập tin

class TờnLớp Tờn lớp

[: TờnLớpCha, GiaoTiếp]

Kế thừa một lớp cha (base class) hay cài đặt cỏc giao tiếp

(interfaces)

{

// Khai bỏo hằng (constant)

// Khai bỏo biến thành viờn (field)

// Khai bỏo phương thức (method) // Khai bỏo thuộc tớnh (property)

// Khai bỏo sự kiện (event)

// Khai bỏo chỉ mục (indexer)

// Khai bỏo tham chiếu phương

thức (delegate)

}

Ngoài ra lớp cú thể chứa định nghĩa lớp khỏc, giao tiếp

(interface) và cấu trỳc (struct).

Phạm vi nhỡn thấy của kiểu (Type visibility): Cỏc kiểu như lớp

(class), giao tiếp (interface), cấu trỳc (struct), danh sỏch liệt kờ (enumeration), và tham chiếu phương thức (delegate), cú thể cú điều

khiển truy xuất public hay internal. Trong C# internal là tựy chọn mặc định cho cỏc kiểu, nếu bạn khụng sử dụng từ khúa public

// Lớp này cú thể dựng cho bất kỳ assembly nào public class MyClass{}

//Những lớp này chỉ dựng trong cựng một assembly

internal class MyHelperClass{}

class FinalHelperClass{} // Mặc định là internal trong C#.

Vớ dụ: Tạo một lớp cỏc đối tượng nhõn viờn như sau:

class NhanVien {

string HoTen; int NamSinh;

float HeSoLuong;

public static int LuongCB; }

Theo nguyờn tắc của tớnh đúng gúi, cỏc biến thành viờn nờn cú

điều khiển truy xuất là private (điều khiển mặc định). Khi đú chỉ cú phương thức thành viờn của lớp truy cập được giỏ trị của biến.

3.1.2 Tạo đối tượng

Để cú được cỏc đối tượng của một lớp phải qua hai giai đoạn:

Khai bỏo biến kiểu tham chiếu để trỏ đến đối tượng

TờnLớp TờnĐốiTượng;

Vớ dụ : NhanVien A;

Khai bỏo biến A cú kiểu lớp NhanVien, thực ra khụng cấp phỏt

bộ nhớ đủ chứa đối tượng kiểu lớp NhanVien, mà chỉ tạo ra tham

chiếu để trỏ đến đối tượng. Sau cõu lệnh này, biến A xuất hiện trờn bộ nhớ chứa giỏ trị null chỉ ra rằng nú chưa trỏ đến một đối tượng

thực tế nào.

Sau đú, để thực sự cấp phỏt bộ nhớ để tạo ra một đối tượng và

gỏn địa chỉ của đối tượng cho biến này, dựng toỏn tử new

TờnĐốiTượng = new TờnLớp();

Thật ra cỳ phỏp đỳng như sau, tuy nhiờn ta sẽ tỡm hiểu về phương thức khởi tạo sau:

TờnĐốiTượng = new PhươngThứcKhởiTạo

Vớ dụ:

A = new NhanVien();

Cú thể kết hợp cả hai bước trờn vào một cõu lệnh: TờnLớp TờnĐốiTượng = new TờnLớp();

Vớ dụ:

NhanVien A = new NhanVien();

Kiểu nặc danh (Anonymous type): C# 3.0 cho phộp tạo đối tượng thuộc lớp mà khụng cần phải định nghĩa lớp trước đú gọi là kiểu nặc danh (anonymous type).

Vớ dụ: Tạo đối tượng học viờn của một lớp cú cỏc thuộc tớnh mó học viờn, họ tờn, năm sinh

var HocVien = new {

mahv = 01,

hoten = "Nguyen Van A", namsinh = 1990

};

Khi biờn dịch, C# sẽ tạo ra một lớp cú 3 thuộc tớnh như trờn.

Ngoài ra, nếu cú 2 khai bỏo tạo đối tượng của cựng một lớp, trỡnh biờn dịch C# sẽ tạo một lớp cho 2 khai bỏo tạo đối tượng như vậy.

3.1.3. Truy xuất thành viờn của lớp

Cỏc thành viờn (members) của một lớp cú thể là thành viờn tĩnh

(static member) hay thành viờn đối tượng (instance member). Núi

chung, thành viờn đối tượng thuộc về đối tượng, và thành viờn tĩnh

thuộc về lớp.

Khi một biến, phương thức, thuộc tớnh, chỉ mục, sự kiện, phộp toỏn, phương thức khởi tạo, phương thức hủy là thành viờn tĩnh, nú được khai bỏo với từ khúa static.

Thành viờn tĩnh khụng hoạt động trờn một đối tượng cụ thể.

Một thành viờn tĩnh chia sẻ chung cho mọi đối tượng thuộc lớp, và

được truy cập thụng qua tờn lớp chứa thành viờn.

Cỏc thành viờn đối tượng hoạt động trờn một đối tượng của lớp và được truy cập thụng qua tờn đối tượng.

Chỳng ta xột hai thành viờn thụng dụng của lớp là biến và

phương thức.

3.1.3.1. Truy xuất biến

Ngoài biến thành viờn của lớp gồm biến đối tượng và biến tĩnh,

cũn cú biến cục bộ được khai bỏo bờn trong phương thức.

Biến đối tượng (Instance variable): chỉ thuộc tớnh đối tượng, khi truy xuất phải khởi tạo đối tượng. Biến đối tượng được truy cập thụng qua tờn đối tượng.

 Khai bỏo biến đối tượng: Kiểu BiếnĐốiTượng;

 Truy cập biến đối tượng: TờnĐốiTượng.BiếnĐốiTượng

Vớ dụ:

NhanVien nv = new NhanVien(); System.Console.WriteLine(nv.hoTen);

Biến tĩnh (Static variable): về bản chất là biến toàn cục, là biến

tĩnh được tạo lập một lần cựng với lớp, dựng chung hay chia sẻ cho mọi đối tượng thuộc lớp, khi truy xuất khụng cần khởi tạo đối tượng,

để trao đổi thụng tin của cỏc đối tượng cựng lớp. Biến tĩnh được truy

cập thụng qua tờn lớp.

 Khai bỏo biến tĩnh: static Kiểu BiếnTĩnh;  Truy cập biến tĩnh: TờnLớp.BiếnTĩnh

Vớ dụ:

Biến cục bộ (Local variable): Được khai bỏo và tồn tại trong phạm vi phương thức. Biến cục bộ bắt buộc phải khởi tạo giỏ trị trước khi sử dụng.

Vớ dụ: Sử dụng biến tĩnh để đếm số đối tượng

using System; public class Bong {

private static int soBong = 0; public Bong()

{

soBong++; }

public static void SoBong() {

Console.WriteLine("{0} So bong bong ", soBong); }

}

public class Test {

static void Main() {

Bong.SoBong();

Bong bong1 = new Bong(); Bong.SoBong();

} }

3.1.3.2. Lời gọi phương thức (Method caller)

Phương thức cú thể là phương thức đối tượng hay phương thức

tĩnh. Để gọi phương thức, bạn gọi tờn phương thức và truyền vào danh

sỏch tham đối thật sự (actual parameters) tương ứng với số lượng, kiểu

và thứ tự cỏc tham đối trong danh sỏch tham đối hỡnh thức (formal

parameters). Khỏc nhau giữa lời gọi phương thức đối tượng và phương

thức tĩnh, đú là phương thức đối tượng được gọi thụng qua tờn đối tượng, cũn phương thức tĩnh được gọi thụng qua tờn lớp.

Phương thức đối tượng (Instance method): Thuộc về đối tượng

và hoạt động trờn một đối tượng cụ thể. Gọi phương thức đối tượng

như biến đối tượng.

TờnĐốiTượng.PhươngThứcĐốiTượng(DanhSỏchThamĐối) Phương thức tĩnh (Static method): Dựng chung cho mọi đối tượng thuộc lớp, khi truy xuất khụng cần khởi tạo đối tượng. Khai

bỏo phương thức tĩnh bổ sung từ khoỏ static. Gọi phương thức tĩnh: TờnLớp.PhươngThứcTĩnh(DanhSỏchThamĐối) Vớ dụ: using System; class NhanVien {

private string HoTen; //Biến đối tượng

private int NamSinh; private float HeSoLuong;

public static int LuongCB; //Biến tĩnh

public float Luong() //Phương thức đối tượng

{

float L = LuongCB * HeSoLuong; //Biến cục bộ

return L; }

}

class Test {

public static void Main(string args[]) {

NhanVien.LuongCB = 290; NhanVien A = new NhanVien(); Console.WriteLine(A.Luong()) ; }

}

Cỏc hằng, phương thức chuẩn toỏn học của lớp Math trong namespace System là hằng, phương thức tĩnh nờn khi gọi khụng cần

Hằng, Phương thức í nghĩa Kiểu giỏ trị trả về Math.E Số E Số thực Math.PI Số Pi Số thực Math.Abs(x) Trị tuyệt đối của số x x cú thể là số nguyờn hay thực Cựng kiểu với x Math.Tan(x) Tan x Số thực Math.Cos(x) Cos x x tớnh bằng radian Số thực Math.Sin(x) Sin x Số thực Math.Exp(x) ex Số thực Math.Log(b, a) Logab Số thực Math.Round(x, n) Làm trũn số nguyờn với n số lẻ Số nguyờn Math.Pow(x, y) Cho xy với x,y là số thực Số thực

Math.Sqrt(x) Khai căn của số x Số thực

Vớ dụ:double s = Math.pow(r,2) * Math.PI;

3.2. PHƯƠNG THỨC

3.2.1. Định nghĩa phương thức (Method definition)

Dạng tổng quỏt của định nghĩa phương thức như sau:

[ĐiềuKhiểnTruyXuất] Phạm vi truy cập phương thức

[static] phương thức tĩnh

[abstract] phương thức trừu tượng

[sealed] phương thức hằng [Kiểu] TờnPhươngThức(DanhSỏchThamĐối) { //Thõn phương thức }

Kiểu (Data type): Kiểu dữ liệu do phương thức trả về, cú thể là

kiểu bất kỳ. Nếu phương thức khụng trả về giỏ trị nào, kiểu trả về của

nú phải là void.

Cỏc phương thức cú kiểu dữ liệu trả về khụng phải là void, sẽ trả về một giỏ trị cho phương thức sử dụng cõu lệnh return như sau:

return BiểuThức;

Giỏ trị của biểu thức được tớnh và trả về cho phương thức.

Danh sỏch tham đối (Parameter list): Danh sỏch tham đối truyền cho phương thức, phõn cỏch bởi dấu phẩy, nằm trong hai dấu ( ) ngay

sau tờn phương thức. Nếu khụng cú tham đối vẫn phải cú ( ). Mỗi tham đối phải khai bỏo kiểu, cú thể là kiểu bất kỳ, cú dạng:

Kiểu ThamĐối, Kiểu ThamĐối2 ...

C# cho phộp sử dụng từ khúa params để khai bỏo tham đối cuối cựng trong danh sỏch tham đối của phương thức là một mảng, do đú một số lượng cỏc tham đối thực sự cú thể truyền vào khi gọi phương thức.

Vớ dụ: Khai bỏo phương thức truyền vào mảng số nguyờn với từ

khúa params

public void methodCaller (params int[] a);

Và phương thức cú thể được gọi với danh sỏch cỏc số nguyờn bất kỳ

methodCaller (1);

methodCaller (1, 2, 3, 4);

int[] explicitArray = new int[5]{1,2,3,4,5}; methodCaller(explicitArray);

Bờn trong phương thức, cỏc tham đối cú thể được truy cập

thụng qua mảng a đó được định nghĩa.

Tham đối đặt tờn (Named argument): C# 4.0 giới thiệu tham đối

đặt tờn (named argument) cho phộp bạn khụng phải nhớ thứ tự tham đối trong danh sỏch tham đối thực sự của lời gọi phương thức. Cỏc

tham đối thực sự truyền vào phương thức cú thể chỉ rừ bởi

tờn của tham đối hỡnh thức. Tham đối đặt tờn cũng làm cho chương

trỡnh dễ đọc hơn bởi vỡ nú chỉ rừ ý nghĩa của tham đối thực sự. Tham đối đặt tờn cú thể sử dụng cho phương thức, chỉ mục, tham chiếu phương thức.

Vớ dụ:Phương thức tớnh diện tớch hỡnh chữ nhật

class HCN {

static int DienTich(int rong, int dai) {

return dai * rong; }

}

class Test {

//Lời gọi phương thức

HCN.DienTich(2, 4);

//Nếu khụng nhớ trật tự cỏc tham đối nhưng nhớ tờn tham đối hỡnh thức

//C# 4.0 cho phộp gọi phương thức

HCN.DienTich(dai: 4, rong: 2);

//Một tham đối đặt tờn cú thể theo sau một tham đối khụng đặt tờn HCN.DienTich(2, dai: 4);

//Nhưng tham đối khụng đặt tờn khụng thể theo sau tham đối đặt tờn HCN.DienTich(dai: 4, 2);

}

Tham đối tựy chọn (Optional argument): C# 4.0 cho phộp

phương thức, chỉ mục hay tham chiếu phương thức cú thể chỉ rừ cỏc

tham đối là bắt buộc hay tựy chọn. Bất kỳ lời gọi phương thức phải

truyền cỏc tham đối bắt buộc nhưng cú thể bỏ qua cỏc tham đối

tựy chọn.

Mỗi tham đối tựy chọn cú một giỏ trị mặc định, nếu bỏ qua tham đối tựy chọn, tham đối sẽ cú giỏ trị mặc định. Một giỏ trị mặc

định phải là biểu thức hằng hay kiểu giỏ trị. Cỏc tham đối tựy chọn được định nghĩa cuối của danh sỏch tham đối, sau cỏc tham đối bắt

buộc. Nếu lời gọi phương thức truyền tham đối cho bất kỳ tham đối

tựy chọn, phải truyền tham đối cho bất kỳ tham đối tựy chọn đứng trước trong danh sỏch tham đối.

Vớ dụ: Phương thức đối tượng MyMethod định nghĩa một tham

đối bắt buộc và hai tham đối tựy chọn.

class MyClass {

public void MyMethod(int r, string o1 = "default string", int o2 = 10) {

Console.WriteLine("{0}: {1} và {2}.", r, o1, o2); }

static void Main(string[] args) {

MyClass obj = new MyClass(); obj.MyMethod(1, "One", 1); obj.MyMethod(2, "Two"); obj.MyMethod(3);

//Lỗi biờn dịch do truyền tham đối tựy chọn thứ ba //nhưng khụng truyền tham đối tựy chọn thứ hai

//obj.MyMethod(3, ,4); //obj.MyMethod(3, 4);

//Nhưng nếu bạn biết tờn tham đối thứ ba, cú thể sử dụng tham đối đặt tờn

obj.MyMethod(3, o2: 4);

//Biờn dịch lỗi do khụng truyền tham đối yờu cầu thứ nhất

//obj.MyMethod("One", 1); //obj.MyMethod();

} }

Cải tiến hơn giao diện thành phần COM (More COM interface):

Cỏc tham đối đặt tờn và tựy chọn cựng với cỏc cải tiến khỏc của C# 3.0, 4.0 đó cải tiến đỏng kể tương tỏc với giao diện thành phần COM.

Chẳng hạn, phương thức AutoFormat trong dịch vụ Excel Interop cú 7 tham đối, tất cả đều là tựy chọn. Trong C# 3.0 và cỏc phiờn bản trước, cỏc tham đối của phương thức này đều là tham đối

bắt buộc.

var excelApp = new Microsoft.Office.Interop.Excel.Application(); excelApp.Workbooks.Add();

excelApp.Visible = true; var myFormat =

Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFor matAccounting1;

excelApp.get_Range("A1", "B4").AutoFormat(myFormat, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,

Type.Missing);

Tuy nhiờn, với C# 4.0, bạn cú thể đơn giản lời gọi phương thức

AutoFormat bằng cỏch sử dụng tham đối đặt tờn và tựy chọn. Tham đối đặt tờn và tựy chọn cho phộp bạn bỏ qua tham đối truyền vào

phương thức nếu khụng muốn thay đổi giỏ trị mặc định.

excelApp.Range["A1", "B4"].AutoFormat(Format: myFormat);

Phương thức mở rộng (Extension method): C# 3.0 cung cấp khả

năng định nghĩa phương thức mở rộng (extension method) cho một

kiểu tồn tại, mà khụng phải tạo kiểu kế thừa hay chỉnh sửa kiểu gốc,

tỏi biờn dịch.

Phương thức mở rộng phải là phương thức tĩnh (static method), nhưng nú được gọi như một phương thức đối tượng. Kiểu dữ liệu của tham đối đầu tiờn của phương thức là kiểu lớp cần bổ sung phương

thức. Phương thức mở rộng phải đặt trong lớp tĩnh, khụng lồng nhau

(non-nested, non-generic static class). Từ khúa this phải đặt trước tham đối đầu tiờn.

Vớ dụ: Bổ sung phương thức đếm số từ trong một chuỗi cho

namespace ExtensionMethods {

public static class MyExtensions {

public static int WordCount(this String str) {

return str.Split(new char[] { ' ', '.', '?' },

StringSplitOptions.RemoveEmptyEntries).Length; } } } using ExtensionMethods; namespace ConsoleApplication1 {

public class Test {

static void Main(string[] args) {

string s = "Hello Extension Methods"; int i = s.WordCount(); Console.WriteLine(i); } } } 3.2.2. Phạm vi truy xuất thành phần của lớp

Cỏc điều khiển truy xuất (Access modifier) cú thể là:

 public: Chỉ ra rằng thành phần này cú thể được truy xuất bởi bất kỳ dũng lệnh nào dự ở trong hay ngoài lớp, assembly mà nú khai bỏo.

 private: Khi khụng cú điều khiển truy xuất nào được dựng, mặc nhiờn là private. Thành phần này chỉ cú thể được truy xuất trong lớp của nú, mọi đoạn mó nằm ngoài lớp, kể cả

 protected: Liờn quan đến sự kế thừa, thành phần chỉ truy xuất

trong lớp và lớp con của nú.

 internal: Thành phần chỉ được truy xuất trong nội bộ một

assembly.

 protected internal: Thành phần được truy xuất trong nội bộ

một assembly hoặc là trong bất kỳ lớp con của nú từ bất kỳ

assembly khỏc.

Ngoài ra trong định nghĩa phương thức tĩnh của một lớp, khụng

thể truy xuất trực tiếp biến đối tượng và phương thức đối tượng trong

lớp đú, chỉ cho phộp truy xuất biến tĩnh và phương thức tĩnh.

Vớ dụ:

class SomeClass {

// Truy cập được ở bất kỳ đõu

public void PublicMethod(){}

// Chỉ truy cập được trong lớp SomeClass

private void PrivateMethod(){}

// Truy cập được trong lớp SomeClass và cỏc lớp kế thừa

protected void ProtectedMethod(){} // Truy cập được trong cựng một assembly internal void InternalMethod(){}

// Truy cập được trong lớp và cỏc lớp kế thừa trong cựng assembly protected internal void ProtectedInternalMethod(){}

// Mặc định là private trong C# void SomeMethod(){}

}

class Test {

static void Main(string[] args) {

SomeClass c = new SomeClass(); c.PublicMethod();

c.ProtectedInternalMethod(); //Lỗi c.PrivateMethod(); //Lỗi c.ProtectedMethod(); //Lỗi c.SomeMethod(); //Lỗi } } 3.2.3. Phương thức Main()

Dạng tổng quỏt của phương thức Main()

[public] static void Main(string args[]) {

// Thõn phương thức

}

[public] static int Main(string args[]) {

// Thõn phương thức

}

 Ứng dụng chỉ cú một lớp cú phương thức Main() là phương

thức được thực hiện đầu tiờn mỗi khi thực hiện ứng dụng.  Từ khoỏ static cho phộp phương thức Main() được gọi khi

khụng cần khởi tạo đối tượng. Vỡ phương thức Main() được gọi đầu tiờn trước khi bất kỳ đối tượng nào được khởi tạo.

 Từ khoỏ void cho biết phương thức Main() khụng trả về giỏ trị, từ khúa int cho biết phương thức Main() cú trả về giỏ trị

số nguyờn.

 Tham đối string args[ ] là một mảng cỏc chuỗi ký tự, chứa

Một phần của tài liệu Giáo trình lập trình windowns form với c net tập 1 TS lê trung hiếu, ths nguyễn thị minh thi (Trang 105)