Chương 3 Xây dựng lớp, đối tượng

 Đị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.

pdf28 trang | Chia sẻ: lylyngoc | Lượt xem: 1641 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Chương 3 Xây dựng lớp, đối tượng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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 [: Lớp cơ sở] { // Các thành phần dữ liệu // 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 (d/s tham số) { ; // 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  . 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: .  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: … ~() { ; } … 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  có thể là private, public, protected hay internal, có thể bất kỳ 1 kiểu trong C#. { 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; } } } 4/10/2012 26 Write-Only Property  Chỉ tồn tại khối set public class Employee { private string fullName; ... // write-only Property for fullName public string Name { set { fullName = value; } } } Các trường chỉ đọc using System; namespace StaticPublicConstants { public class RightNow { // public member variables public static int Year; public static int Month; public static int Date; public static int Hour; public static int Minute; public static int Second; static RightNow( ) { System.DateTime dt = System.DateTime.Now; Year = dt.Year; Month = dt.Month; Date = dt.Day; Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second; } } Các trường chỉ đọc public class Tester { static void Main( ) { Console.WriteLine( "This year: {0}", RightNow.Year.ToString( ) ); RightNow.Year = 2009; Console.WriteLine( "This year: {0}", RightNow.Year.ToString( ) ); } // kết thúc main } // kết thúc lớp Tester } // kết thúc namespace Output: This year: 2008 This year: 2009 4/10/2012 27 Các trường chỉ đọc  Để cho các chương trình client được phép đọc và tránh thay đổi giá trị thuộc tính year, chúng ta khai báo như sau public static readonly int Year; // thuộc tính chỉ đọc  Lúc này nếu ai đó thay đổi RightNow.Year = 2009; // lỗi Cấu trúc lớp nhìn từ trong Cấu trúc lớp từ phía người dùng 4/10/2012 28 Tóm tắt chương  Đối tượng  Lớp  Phương thức thiết lập, quá tải  Thuộc tính  Thành phần Static  Truyền tham số Q&A Thank you all for your attention and patient !