Bài giảng Lập trình hướng đối tượng - Chương 2: Lớp và đối tượng - Lê Viết Mẫn

Hai mặt của lớp • Thiết kế lớp (người lập trình lớp) • Cài đặt một lớp tốt nhất có thể mà không lo lắng về cách nó sẽ được sử dụng • Cung cấp dữ liệu thích hợp • Cung cấp các hàm thích hợp • Cung cấp các đặc tính tổng quát cho các lớp chung, đặc tính riêng biệt cho các lớp chuyên biệt • Sử dụng lớp (người lập trình ứng dụng) • Tập trung vào các giao diện public • Lớp đó có thể làm gì, chứ không phải nó làm việc đó thế nào Lớp và đối tượng Quy tắc thiết kế lớp • Nghĩ về từ “trách nhiệm” • Lớp có trách nhiệm gì trong việc duy trì dữ liệu này ? • Lớp có trách nhiệm gì trong việc thực hiện tính toán đó hay cung cấp dịch vụ đó (lớp nào nên định nghĩa hàm đó) ? • Cài đặt che dấu dữ liệu • Thông thường, dùng private cho dữ liệu • Thông thường, dùng public cho các hàm • Che dấu các hàm “trợ giúp” (dùng private) • Chỉ cho phép truy xuất dữ liệu thông qua các hàm public (những hàm này là giao diện public của lớp)

pdf73 trang | Chia sẻ: thanhle95 | Lượt xem: 373 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình hướng đối tượng - Chương 2: Lớp và đối tượng - Lê Viết Mẫn, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng v 3.0 - 09/2018 Lớp và đối tượng 1 Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng chúng ta đã học... 2 Tuần tự Rẽ nhánh Lặp Hàm Cấu trúc chương trình Tổ chức dữ liệu bool char short int long float double string Kiểu dữ liệu array Programs = Data Structure + Algorithms Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng chúng ta sẽ học... 3 Tuần tự Rẽ nhánh Lặp Hàm Cấu trúc chương trình Tổ chức dữ liệu bool char short int long float double string Kiểu dữ liệu array class Programs = Object-Oriented Programming Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng cụ thể... 4 Bank Account - nameCustomer : string - accountBalance : int = 0 + deposit() + withdraw() + transfer() thành code sử dụng C# chuyển mô hình Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Nội dung 1. Primitives vs Objects 2. Lập trình Hướng đối tượng 3. Lớp và đối tượng 4. Một số vấn đề khác 4.1. Từ khoá this 4.2. Cấu tử 4.3. Các thành phần static 4.4. Thuộc tính, thuộc tính tự động 4.5. Biến thành phần chỉ đọc 5 Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Primitives vs Objects 6 Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Primitive data • Dạng dữ liệu cơ bản nhất, được lưu trữ trực tiếp trong bộ nhớ • Thuộc vào kiểu trị • Toán tử: +, -, /, * • Toán tử kết hợp: ++, --, +=, *= 7 bool char sbyte short int long byte ushort uint ulong float double decimal x 17 y 17 stack int x = 17; int y = x; “value semantics” Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Object data • Cách lưu trữ nhiều dữ liệu và các xử lý cho dữ liệu đó trong cùng một thành phần • Thuộc vào kiểu tham chiếu • Hàm/Phương thức 8 string Array List x 0x0a10 y 0x0a10 stack int[] x = new int[3]; int[] y = x; “reference semantics” 0 heap 0 0 0 1 2 “hello”.Equals(“world”) [1, 2, 3].Reverse() Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng null • Có nghĩa là “no object” • “giá trị 0” cho các object • NullReferenceException • “” là không phải null 9 strArr 0x0a1b stack string[] strArr = new string[5]; null heap null null 0 1 2 strArr[0].Length null 3 null 4 “”.Length // trả ra 0 Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lập trình Hướng đối tượng 10 Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lập trình Hướng đối tượng 11 • Tất cả mọi thứ trong C# đều là đối tượng (object) và có kiểu (class) • Các đối tượng là sự trừu tượng hoá dữ liệu, chứa: • đặc tính (attribute) - nơi lưu trữ dữ liệu • phương thức (method), là giao diện cho phép tương tác với đối tượng, định nghĩa hành vi nhưng che dấu cài đặt • Có thể tạo các thể hiện (instance) của đối tượng • Có thể huỷ/xoá các đối tượng “hello world” 1234 [1, 2, 3] true Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lớp & đối tượng trong C# 12 Định nghĩa lớp Sử dụng từ khoá class Định nghĩa một kiểu dữ liệu mới Đặc tính Các biến thành phần (gọi tắt là biến) Hành vi Phương thức / hàm Có hai loại hàm với hai cách triệu gọi khác nhau : • Hàm không tĩnh - Gọi từ đối tượng • Hàm tĩnh (từ khoá static) - Gọi từ lớp Bitmap bm = new Bitmap(20, 20); bm.Save("bitmap.png"); Console.Write("Please enter a number :"); Định nghĩa lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lớp & đối tượng trong C# 13 Định nghĩa lớp Sử dụng từ khoá class Định nghĩa một kiểu dữ liệu mới Đặc tính Các biến thành phần (gọi tắt là biến) Hành vi Phương thức / hàm Có hai loại hàm với hai cách triệu gọi khác nhau : • Hàm không tĩnh - Gọi từ đối tượng • Hàm tĩnh (từ khoá static) - Gọi từ lớp Tạo một đối tượng của một lớp Khai báo một biến có kiểu dữ liệu nào đó và ghi dữ liệu vào biến đó Sử dụng từ khoá new Bitmap bm = new Bitmap(20, 20); Bitmap bm = new Bitmap(20, 20); bm.Save("bitmap.png"); Console.Write("Please enter a number :"); Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Hai mặt của lớp • Thiết kế lớp (người lập trình lớp) • Cài đặt một lớp tốt nhất có thể mà không lo lắng về cách nó sẽ được sử dụng • Cung cấp dữ liệu thích hợp • Cung cấp các hàm thích hợp • Cung cấp các đặc tính tổng quát cho các lớp chung, đặc tính riêng biệt cho các lớp chuyên biệt • Sử dụng lớp (người lập trình ứng dụng) • Tập trung vào các giao diện public • Lớp đó có thể làm gì, chứ không phải nó làm việc đó thế nào 14 Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Quy tắc thiết kế lớp • Nghĩ về từ “trách nhiệm” • Lớp có trách nhiệm gì trong việc duy trì dữ liệu này ? • Lớp có trách nhiệm gì trong việc thực hiện tính toán đó hay cung cấp dịch vụ đó (lớp nào nên định nghĩa hàm đó) ? • Cài đặt che dấu dữ liệu • Thông thường, dùng private cho dữ liệu • Thông thường, dùng public cho các hàm • Che dấu các hàm “trợ giúp” (dùng private) • Chỉ cho phép truy xuất dữ liệu thông qua các hàm public (những hàm này là giao diện public của lớp) 15 Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Giao diện public • Người sử dụng sử dụng một đối tượng mà không cần biết nó xử lý thế nào ở bên trong • Dữ liệu là không thấy được từ bên ngoài • Các thuật toán là cũng không thấy được từ bên ngoài • Chỉ có các đặc tính, giao diện public là đưa ra cho bên ngoài • Bao gồm các đặc tính không phải private • Thường là các hàm thành viên public • Giao diện public là con đường duy nhất để đạt đến sự đóng gói của đối tượng 16 Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lớp và đối tượng 17 Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lớp UML → Lớp C# 18 Person - name : string + height : int # weight : int -instance count : int = 0 > + Person() + Person(name:string) > + payTaxes() : void + catchBus(direction : int) : void > + takeLongLunch() : bool • Tên lớp • ảo • Đặc tính (field) • Biến thành phần • Thuộc tính (property) • Các biến cấp lớp • static • Hành vi • Cấu tử (constructor) • Huỷ tử (destructor) • Hàm thành phần (method) Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lớp UML → Lớp C# 19 Person - name : string + height : int # weight : int -instance count : int = 0 > + Person() + Person(name:string) > + payTaxes() : void + catchBus(direction : int) : void > + takeLongLunch() : bool • Tên lớp • ảo • Đặc tính (field) • Biến thành phần • Thuộc tính (property) • Các biến cấp lớp • static • Hành vi • Cấu tử (constructor) • Huỷ tử (destructor) • Hàm thành phần (method) Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lớp UML → Lớp C# 20 Person - name : string + height : int # weight : int -instance count : int = 0 > + Person() + Person(name:string) > + payTaxes() : void + catchBus(direction : int) : void > + takeLongLunch() : bool • Tên lớp • ảo • Đặc tính (field) • Biến thành phần • Thuộc tính (property) • Các biến cấp lớp • static • Hành vi • Cấu tử (constructor) • Huỷ tử (destructor) • Hàm thành phần (method) Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lớp UML → Lớp C# 21 Person - name : string + height : int # weight : int -instance count : int = 0 > + Person() + Person(name:string) > + payTaxes() : void + catchBus(direction : int) : void > + takeLongLunch() : bool • Tên lớp • ảo • Đặc tính (field) • Biến thành phần • Thuộc tính (property) • Các biến cấp lớp • static • Hành vi • Cấu tử (constructor) • Huỷ tử (destructor) • Hàm thành phần (method) Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lớp UML → Lớp C# 22 Person - name : string + height : int # weight : int -instance count : int = 0 > + Person() + Person(name:string) > + payTaxes() : void + catchBus(direction : int) : void > + takeLongLunch() : bool • Tên lớp • ảo • Đặc tính (field) • Biến thành phần • Thuộc tính (property) • Các biến cấp lớp • static • Hành vi • Cấu tử (constructor) • Huỷ tử (destructor) • Hàm thành phần (method) Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lớp UML → Lớp C# 23 Person - name : string + height : int # weight : int -instance count : int = 0 > + Person() + Person(name:string) > + payTaxes() : void + catchBus(direction : int) : void > + takeLongLunch() : bool • Tên lớp • ảo • Đặc tính (field) • Biến thành phần • Thuộc tính (property) • Các biến cấp lớp • static • Hành vi • Cấu tử (constructor) • Huỷ tử (destructor) • Hàm thành phần (method) Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lớp UML → Lớp C# 24 Person - name : string + height : int # weight : int -instance count : int = 0 > + Person() + Person(name:string) > + payTaxes() : void + catchBus(direction : int) : void > + takeLongLunch() : bool • Tên lớp • ảo • Đặc tính (field) • Biến thành phần • Thuộc tính (property) • Các biến cấp lớp • static • Hành vi • Cấu tử (constructor) • Huỷ tử (destructor) • Hàm thành phần (method) Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Ví dụ 25 Bài toán Mô hình hóa việc tính toán trong sinh vật học Viết chương trình mô phỏng sự sinh sôi của quần thể virus trong con người theo thời gian. Mỗi tế bào virus tự sinh sôi sau một khoảng thời gian nhất định. Bệnh nhân có thể uống thuốc để kiềm chế quá trình sinh sôi này, và loại bỏ các tế bào virus ra khỏi cơ thể. Tuy nhiên, một số tế bào chống lại thuốc và có thể tiếp tục tồn tại. Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng 26 Bệnh nhân Thuộc tính số lượng virus sự miễn dịch (%) Hành vi uống thuốc Virus Thuộc tính tốc độ sinh sản (%) sự kháng thuốc (%) Hành vi sinh sôi sống sót Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lớp Virus 27 Virus - reproductionRate : float - resistance : float -instance defaultReproductionRate : float = 0.1 > + Virus(newResistance : float) + Virus(newReproductionRate : float, newResistance : float) > + reproduce(immunity : float) : Virus + survive(immunity : float) : bool Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cài đặt lớp Virus (1/7) 28 Virus.cs Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cài đặt lớp Virus (2/7) 29 Virus.cs Khai báo mỗi lớp trong file .cs riêng Lớp bắt đầu với tên lớp, theo sau từ khóa class • Tên lớp được đặt theo ký pháp Pascal Thân lớp đặt trong cặp dấu ngoặc nhọn Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cài đặt lớp Virus (3/7) 30 Virus.cs Khai báo các đặc tính của lớp, như khai báo biến Có thể khởi gán giá trị ban đầu cho các biến này Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cài đặt lớp Virus (4/7) 31 Virus.cs Thành phần dữ liệu hằng Mặc định là thành phần tĩnh (static), nhưng vẫn có thể truy xuất bởi tất cả các thành phần của kiểu Không thể khởi gán giá trị cho hằng trong cấu tử Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Tạo và sử dụng đối tượng 32 Virus.cs Program.cs Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng ` 33 Virus.cs private public private - chỉ có thể truy xuất bên trong lớp public - có thể truy xuất bởi bất kỳ ai Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng private vs public 34 • Giao diện (Interface) - các phần của lớp mà thay đổi không thường xuyên • Virus phải được cho phép sinh sôi • Cài đặt (Implementation) - các phần có thể thay đổi thường xuyên • Sự thể hiện của sự kháng thuốc bên trong virus Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Bảo vệ thành phần private 35 • Nên • Thiết lập biến thành phần là private • Cực tiểu số hàm thành phần public Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cài đặt lớp Virus (5/7) 36 Virus.cs Cấu tử (constructor) cùng tên với lớp Không có kiểu trả về Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cấu tử - Constructor • Là hàm thành phần đặc biệt • Luôn có cùng tên với lớp chứa nó • Không có kiểu trả về (thậm chí cả void) • Có thể nạp chồng cấu tử • Có thể có đối số mặc định • Được gọi tự động khi một đối tượng được khởi tạo (cấp phát bộ nhớ) sử dụng từ khoá new • Tất cả các đối tượng của kiểu class đều thuộc kiểu tham chiếu • Được dùng để khởi tạo các biến thành phần của lớp, xin cấp phát vùng nhớ cho các biến thành phần kiểu tham chiếu 37 Virus virus = new Virus(0.4f); Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Gọi hàm cấu tử 38 Virus.cs Program.cs Gọi hàm cấu tử với số đối số và kiểu đối số tương ứng Số lượng đối số sẽ phụ thuộc vào các cấu tử mà kiểu đó hỗ trợ Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cài đặt hai cấu tử lớp Virus 39 Virus.cs Cài đặt cho hai cấu tử Luôn nhớ khởi tạo cho tất cả các biến thành phần bên trong cấu tử Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cấu tử mặc định • Mỗi lớp C# có sẵn một cấu tử mặc định (có thể định nghĩa lại khi cần) • Cấu tử mặc định không có tham số • Khi tạo đối tượng với lời gọi : • Nếu bạn không định nghĩa lại cấu tử mặc định • Sau khi C# cấp phát bộ nhớ cho biến virus, cấu tử mặc định đảm bảo tất cả các biến thành phần của lớp Virus được khởi gán giá trị sử dụng giá trị mặc định của kiểu dữ liệu của các biến thành phần • Định nghĩa lại cấu tử mặc định • Nhằm khởi tạo giá trị cho các biến thành phần đúng với thực tế • Ví dụ : tuổi của nhân viên phải ≥ 18 40 Virus virus = new Virus(); Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Chú ý • Ngay khi bạn cài đặt một cấu tử bất kỳ • (kể cả không phải là định nghĩa lại cấu tử mặc định) • C# sẽ xoá cấu tử mặc định có sẵn • Lúc này, nếu bạn vẫn muốn giữ lại một cấu tử mặc định thì nên cài đặt : 41 public Virus() {} Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cài đặt lớp Virus (6/7) 42 Virus.cs Cài đặt các hàm thành phần Không sử dụng từ khoá static Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cài đặt hai hàm thành phần 43 Vi ru s. cs Có thể truy xuất các biến và hàm thành phần khác trong lớp Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Sử dụng hàm thành phần 44 Program.cs Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Lớp Patient 45 Patient - virusPop : Virus[] - numVirusCells : int - immunity : float > + Patient(initImmunity : float, initNumViruses : int) > + ~Patient() > + takeDrug() + simulateStep() Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cài đặt lớp Patient 46 Patient.cs Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cài đặt lớp Patient 47 Patient.cs virusPop là một mảng các đối tượng kiểu Virus Hàm hủy tử có khuôn dạng ~() Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Huỷ tử - Destructor • Là hàm thành phần • Không bao giờ có tham số (tức là, không cho phép chồng hàm) • Không có kiểu trả về • Luôn có cùng tên với lớp chứa nó (cộng thêm dấu ~ ở trước tên hàm) • Được gọi tự động khi một đối tượng vượt quá phạm vi tồn tại của nó hoặc bị xóa • Được sử dụng để dọn dẹp • Hủy cấp phát bộ nhớ • Đóng các file hay xóa các file tạm • Ngắt kết nối mạng và cơ sở dữ liệu 48 virus = null; Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Tạo đối tượng của lớp khác 49 Patient.cs Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Sử dụng đ.t đã được cấp phát 50 Patient.cs Sử dụng toán tử dấu chấm để truy xuất các thành phần public Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Program.cs Lớp và đối tượng Lớp Programs 51 Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Gọi hàm cấu tử 52 Patient.cs Program.cs Định nghĩa lớp Sử dụng lớp Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Một số vấn đề khác 53 Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Từ khoá this 54 • Tham chiếu đến các thể hiện trong phần định nghĩa lớp • Tham số “bí ẩn” được truyền cho mỗi hàm thành phần không tĩnh Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Từ khoá this 55 static void Main() { Time t1 = new Time(1, 20); Time t2 = new Time(1, 40); t2.Add(t1); } t11,20 1,40 t2 3,00 t3 this Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Gọi cấu tử khác sử dụng this • Thông thường, các cấu tử phải kiểm tra dữ liệu khởi tạo có phù hợp hay không (business rules) • Nếu phần kiểm tra này lặp lại trong nhiều cấu tử thì sẽ dẫn đến trùng lặp • Giải pháp : • tách phần kiểm tra này ra một hàm riêng • hoặc sử dụng từ khoá this để gọi lại các cấu tử đã có 56 class Motorcycle { ... public Motorcycle() {} public Motorcycle(int intensity) : this(intensity, “”) {} public Motorcycle(string name) : this(0, name) {} public Motorcycle(int intensity, string name) { if (intensity > 10) ... } } Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cấu tử và các loại tham số • Tham số mặc định • Tham số đặt tên • có thể bỏ qua các đối số 57 class Motorcycle { ... public Motorcycle(int intensity = 0, string name = “”) { if (intensity > 10) intensity = 10; driverIntensity = intensity; driverName = name; } ... } Motorcycle m4 = new Motorcycle(name : “Kawasaki”); Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Thành phần cấp đối tượng • Được tạo ra cho mỗi thể hiện của lớp, thuộc về thể hiện đó • Được truy xuất thông qua thể hiện (biến) 58 Thành phần cấp lớpvs • Thuộc về lớp, truy xuất thông qua tên lớp • Khai báo kèm với từ khoá static • Được chia sẻ chung giữa tất cả các thể hiện của lớp đó Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Các thành phần static • Các thành phần static là các thành phần thuộc cấp lớp • Được triệu gọi trực tiếp từ lớp, hay được dùng để chia sẻ cho tất cả các đối tượng • Hàm thành phần static không có con trỏ this, chỉ có thể truy vấn các thành phần static khác 59 class SavingAccount { double currBalance; static double currInterestRate = 0.04; public SavingAccount(double balance) { currBalance = balance; } public static void SetInterestRate(double newRate) { currInterestRate = newRate; } } SavingAccount.cs sa1 sa2 sa3 0.04 currInterestRate Dù có tạo ra bao nhiêu đối tượng mới thì giá trị của biến static currInterestRate cũng sẽ không đổi, chỉ thay đổi khi sử dụng hàm static SetInterestRate Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Cấu tử static • Dùng để khởi gán giá trị cho các biến thành phần static 60 class SavingAccount { double currBalance; static double currInterestRate; public SavingAccount(double balance) { currInterestRate = 0.04; currBalance = balance; } } Giá trị của biến tĩnh currInterestRate sẽ gán lại giá trị 0.04 mỗi khi một đối tượng mới được tạo ra class SavingAccount { double currBalance; static double currInterestRate; public SavingAccount(double balance) { currBalance = balance; } static SavingAccount() { currInterestRate = 0.04; } } Giải pháp hoặc class SavingAccount { ... static double currInterestRate = 0.04; ... Lê Viết Mẫn - lvman@hce.edu.vn Lớp và đối tượng Phép gán và cấu tử sao chép • C# không cung cấp cấu tử sao chép (chuyển đổi), nên bạn phải cài đặt cấu tử này • sao chép từng giá trị của các biến thành phần cho nhau 61 Virus v = new Virus(0.1, 5); Virus v1 = v; 0x0a10 v1 0x0a10 v 0.1 5 public Virus(Virus virus) { reproduction
Tài liệu liên quan