Chương 9 – Lập trình hướng đối tượng trong C#
Outline
9.1. Lớp và đối tượng - Class and Objects
9.2. Giao diện - Interfaces
9.3. Quyền truy cập - Modifiers
9.4. Thuộc tính - Properties
9.5. Phương thức – Methods
9.6. Sự kiện và hàm đại diện- Events and Delegates
9.7. Tính kế thừa – Inheritance
Các lớp cơ sở và các lớp dẫn xuất
Protected Members
Phương thức khởi tạo: Constructors và hủy Destructors
trong lớp dẫn xuất
9.8. Tính đa hình – Polymorphism
Lớp Abstract và phương thức
Nạp chồng toán tử
9.1. Lớp và đối tượng - Class and Objects
Cơ sở của lập trình hướng đối tượng gắn liền với sự ra đời và định nghĩa về
lớp và đối tượng .
Tên_lớp_cha : Tên của lớp cha mà lớp kế thừa từ đó
9.1
Khởi tạo đối tượng
Khởi tạo ( Instantiate ) một đối tượng từ một lớp là cấp phát bộ nhớ
cho đối tượng đó trong vùng nhớ Heap . Một đối tượng được khai
báo nhưng chưa khởi tạo thì chưa được cấp phát bộ nhớ
Cách khởi tạo một đối tượng trong C# giống với Java và VB.Net
<Tên_đối_tượng>= new <Tên_lớp> ( Các tham số nếu có )
9.1
Phương thức khởi tạo - Constructor
Constructor là một phương thức đặc biệt của lớp
Dùng để khởi tạo đối tượng và thiết lập các dữ liệu ban đầu trong
một lớp
Constructor có cùng tên với tên lớp và không có giá trị trả về
Constructor có thể nạp chồng
Constructor phải được sử dụng với bổ từ truy cập public
Constuctor trong C# giống hệt constructor trong Java
Cú pháp :
Ta cũng có thể có static constructor ( phương thức khởi
tạo tĩnh ) . Đây là phương thức chỉ được thực hiện một lần
bất cứ khi nào một đối tượng của lớp được Instantiate . Tác
dụng của static constructor là giúp ta khởi tạo giá trị cho các
biến thành phần kiểu static trong một lớp
9.1
Phương thức khởi tạo - Constructor
1 // Time1.cs
2 // Class Time1 maintains time in 24-hour format.
3
4 using System;
5
6 // Time1 class definition
7 public class Time1 : Object
8 {
9 private int hour; // 0-23
10 private int minute; // 0-59
11 private int second; // 0-59
12
13 // Time1 constructor initializes instance variables to
14 // zero to set default time to midnight
15 public Time1()
16 {
17 SetTime( 0, 0, 0 );
18 }
19
20 // Set new time value in 24-hour format. Perform validity
21 // checks on the data. Set invalid values to zero.
22 public void SetTime(
44 ( ( hour == 12 || hour == 0 ) ? 12 : hour % 12 ),
45 minute, second, ( hour < 12 ? "AM" : "PM" ) );
46 }
47
48 } // end class Time1
Giờ ra theo định
dạng quốc tế
Giờ ra có định dạng chuẩn
Time1.cs
9.1
1 // TimeTest1.cs
2 // Demonstrating class Time1.
3
4 using System;
5 using System.Windows.Forms;
6
7 // TimeTest1 uses creates and uses a Time1 object
8 class TimeTest1
9 {
10 // main entry point for application
11 static void Main( string[] args )
12 {
13 Time1 time = new Time1(); // calls Time1 constructor
14 string output;
15
16 // assign string representation of time to output
17 output = "Initial universal time is: " +
18 time.ToUniversalString() +
19 "\nInitial standard time is: " +
38 MessageBox.Show( output, "Testing Class Time1" );
39
40 } // end method Main
41
42 } // end class TimeTest1
9.1
Đối tượng this và base
Không giống như trong C++ this là một con trỏ . Trong C# và Java ,
this là một đối tượng để chỉ ra đối tượng đang tham chiếu đến .
Dùng đối tượng this để truy cập đến các biến và hàm thành viên
của lớp
base là một đối tượng được định nghĩa sẵn trong C# để truy cập
đến đối tượng là một thể hiện của lớp cha của lớp đang tham chiếu
đến . Dùng base , ta có thể truy cập đến các thuộc tính và phương
thức của lớp cha .
base trong C# giống như super trong Java và MyBase trong VB.Net
9.1
1 // Time4.cs
2 // Class Time2 provides overloaded constructors.
3
4 using System;
5
6 // Time4 class definition
7 public class Time4
30 public string ToStandardString()
31 {
32 return String.Format( "{0}:{1:D2}:{2:D2} {3}",
33 ( ( this.hour == 12 || this.hour == 0 ) ? 12 :
34 this.hour % 12 ), this.minute, this.second,
35 ( this.hour < 12 ? "AM" : "PM" ) );
36 }
37
38 } // end class Time4
Con trỏ this dùng để truy
cập vào các biến thành
phần
9.1
ThisTest1 // ThisTest.cs
2 // Using the this reference.
3
4 using System;
5 using System.Windows.Forms;
6
7 // ThisTest class definition
8 class Class1
9 {
10 // main entry point for application
11 static void Main( string[] args )
12 {
13 Time4 time = new Time4( 12, 30, 19 );
14
15 MessageBox.Show( time.BuildString(),
16 "Demonstrating the \"this\" Reference" );
Là phương thức ngược lại với phương thức khởi tạo - nó huỷ
đối tượng đã được tạo ra bằng phương thức khởi tạo .
Destructor có tên là dấu “ ~ “ theo sau là tên lớp.
Destructor không chứa tham số , không trả lại giá trị và
không có bổ từ truy cập đi kèm
Khai báo Destructor
~ <Tên_lớp > ( )
Ví dụ :
~ MyClass ( )
{
// Đặt mã cần xử lý ở đây
}
9.1
Các thành phần tĩnh của lớp
(static Class Members)
Mỗi đối tượng của lớp có một bản sao riêng của tất cả các thể hiện
của biến
Đôi khi sẽ thật có ích nếu tất cả các thể hiện của một lớp có chung
một bản sao của biến
Khai báo biến dùng từ khoá static cho phép tạo một bản sao duy
nhất cho một biến tại một thời điểm(được dùng chung cho tất cả các
23 }
24
25 // destructor decrements static Employee count
26 ~Employee()
27 {
28 count;
29
30 Console.WriteLine( "Employee object destructor: " +
31 firstName + " " + lastName + "; count = " + Count );
32 }
33
Huỷ Employee
Giảm biến đếm các
thành phần tĩnh,để thấy
ít hơn một employee
Cập nhật số công nhân
Employees
Employee.cs
9.1
Employee.cs
34 // FirstName property
35 public string FirstName
36 {
37 get
38 {
39 return firstName;
40 }
41 }
42
10 static void Main( string[] args )
11 {
12 Console.WriteLine( "Employees before instantiation: " +
13 Employee.Count + "\n" );
14
15 // create two Employees
16 Employee employee1 = new Employee( "Susan", "Baker" );
17 Employee employee2 = new Employee( "Bob", "Jones" );
18
19 Console.WriteLine( "\nEmployees after instantiation: " +
20 "Employee.Count = " + Employee.Count + "\n" );
21
22 // display the Employees
23 Console.WriteLine( "Employee 1: " +
24 employee1.FirstName + " " + employee1.LastName +
25 "\nEmployee 2: " + employee2.FirstName +
26 " " + employee2.LastName + "\n" );
27
28 // mark employee1 and employee1 objects for
29 // garbage collection
30 employee1 = null;
31 employee2 = null;
32
33 // force garbage collection
34 System.GC.Collect();
35
Tạo 2 đối tượng
Employee
Thiết lập đối tượng
Employee là null
Các thành phần const là hoàn toàn tĩnh ( static )
Thành phần const phải được khởi tạo khi khai báo
Từ khoá readonly để khai báo các thành phần sẽ được khởi tạo
bằng constructor nhưng sau đó không thay đổi
9.1
9.1
1 // UsingConstAndReadOnly.cs
2 // Demonstrating constant values with const and readonly.
3
4 using System;
5 using System.Windows.Forms;
6
7 // Constants class definition
8 public class Constants
9 {
10 // PI is constant variable
11 public const double PI = 3.14159;
12
13 // radius is a constant variable
14 // that is uninitialized
15 public readonly int radius;
16
17 public Constants( int radiusValue )
18 {
19 radius = radiusValue;
20 }
21