Gọi phương thức của lớp cơ sở

Một phần của tài liệu Giáo án - Bài giảng: LẬP TRÌNH HƯỚNG đối TƯỢNG TRONG CSHARP (Trang 43 - 51)

Trong ví dụ 3, phương thức DrawWindow() của lớp ListBox sẽ làm ẩn và thay thế phương thức DrawWindow của lớp cơ sở Window. Khi chúng ta gọi phương thức DrawWindow của một đối tượng của lớp ListBox thì phương thức ListBox.DrawWindow() sẽ được thực hiện, không phải phương thức Window.DrawWindow() của lớp cơ sở Window. Tuy nhiên, ta có thể gọi phương thức DrawWindow() của lớp cơ sở thông qua từ khóa base:

base.DrawWindow(); // gọi phương thức cơ sở. Từ khóa base chỉ đến lớp cơ sở cho đối tượng hiện hành.

Gc ca tt c các lp: Lp Object

Tất cả các lớp của ngôn ngữ C# của bất cứ kiểu dữ liệu nào thì cũng được dẫn xuất từ lớp System.Object. Thú vị là bao gồm cả các kiểu dữ liệu giá trị. Một lớp cơ sở là cha trực tiếp của một lớp dẫn xuất. Lớp dẫn xuất này cũng có thể làm cơ sở cho các lớp dẫn xuất xa hơn nữa, việc dẫn xuất này sẽ tạo ra một cây thừa kế hay một kiến trúc phân cấp. Lớp gốc là lớp nằm ở trên cùng cây phân cấp thừa kế, còn các lớp dẫn xuất thì nằm bên dưới. Trong ngôn ngữ C#, lớp gốc là lớp Object, lớp này nằm trên cùng trong cây phân cấp các lớp.

Lớp Object cung cấp một số các phương thức dùng cho các lớp dẫn xuất có thể thực hiện việc phủ quyết. Những phương thức này bao gồm: Equals() kiểm tra xem hai đối tượng có giống nhau hay không. Phương thức GetType() trả về kiểu của đối tượng. Và phương thức ToString () trả về một chuỗi thể hiện lớp hiện hành.

Chức năng của một số phương thức

GetHashCode( ): Cho phép những đối tượng cung cấp riêng những hàm băm cho sử dụng tập hợp.

GetType( ): Cung cấp kiểu của đối tượng.

ToString( ): Cung cấp chuỗi thể hiện của đối tượng. Finalize( ): Dọn dẹp các tài nguyên.

MemberwiseClone( ): Tạo một bản sao từ đối tượng.

Ví dụ 5 sau minh họa việc sử dụng phương thức ToString( ) thừa kế từ lớp Object.

Ví dụ 5: Thừa kế từ Object.

---

using System;

publicclass SomeClass {

public SomeClass( int val ) {

value = val; }

// phủ quyết phương thức ToString của lớp Object

publicvirtualstring ToString() {

return value.ToString(); }

// biến thành viên private lưu giá trị

privateint value; }

publicclass Tester {

staticvoid Main( ) {

int i = 5;

Console.WriteLine(“The value of i is: {0}”, i.ToString()); SomeClass s = new SomeClass(7);

Console.WriteLine(“The value of s is {0}”, s.ToString()); Console.WriteLine(“The value of 5 is {0}”,5.ToString()); }

Kết quả:

The value of i is: 5

The value of s is 7

The value of 5 is 5 (adsbygoogle = window.adsbygoogle || []).push({});

---

Trong tài liệu của lớp Object phương thức ToString() được khai báo như sau:

publicvirtual string ToString();

Đây là phương thức ảo public, phương thức này trả về một chuỗi và không nhận tham số. Tất cả kiểu dữ liệu được xây dựng sẵn, như kiểu int, dẫn xuất từ lớp Object nên nó cũng có thể thực thi các phương thức của lớp Object.

Lớp SomeClass trong ví dụ trên thực hiện việc phủ quyết phương thức ToString(), do đó phương thức này sẽ trả về giá trị có nghĩa. Nếu chúng ta không phủ quyết phương thức ToString() trong lớp SomeClass, phương thức của lớp cơ sở sẽ được thực thi, và kết quả xuất ra sẽ có thay đổi như sau:

The value of s is SomeClass

Như chúng ta thấy, hành vi mặc định đã trả về một chuỗi chính là tên của lớp đang thể hiện. Các lớp không cần phải khai báo tường minh việc dẫn xuất từ lớp Object, việc kế thừa sẽ được đưa vào một cách ngầm định. Như lớp SomeClass trên ta không khai báo bất cứ dẫn xuất của lớp nào nhưng C# sẽ tự động đưa lớp Object thành lớp dẫn xuất. Do đó ta mới có thể phủ quyết phương thức ToString() của lớp Object.

Phương thức Overriden và Hide:

Bằng cách khai báo virtual trong một hàm ở lớp cơ sở thì cho phép hàm đó được overriden trong bất kỳ một lớp thừa hưởng nào.

class MyBaseClass {

publicvirtual string VirtualMethod() {

return "This method is virtual and defined in MyBaseClass"; }

Như ví dụ trên, tức là ta có thể tạo ra một sự thực thi khác của

VirtualMethod() trong một lớp thừa hưởng của MyBaseClass. Và khi gọi

phương thức trong một thể hiện của lớp thừa hưởng thì phương thức của lớp thừa hưởng sẽ được thi hành mà không quan tâm đến phương thức đó ở lớp cơ sở. Khác với C++ và Java, trong C# những hàm không được khai báo virtual mặc định mà bạn phải khai báo virtual một cách rõ ràng và khi một hàm muốn override một hàm khác thì phải sử dụng từ khoá override:

class MyDerivedClass : MyBaseClass {

publicoverridestring VirtualMethod() {

return "This method is an override defined in MyDerivedClass"; }

}

Những trường thành viên(member fields) và những hàm tĩnh thì không được khai báo Virtual. Nếu một phương thức có cùng đặc tính trong cả hai khai báo ở lớp cơ sở và lớp thừa hưởng nhưng các phương thức này thì không khai báo virtual hay overriden thì sẽ được gọi là: "lớp thừa hưởng hide lớp cơ sở đó". Kết quả là: phương thức nào được gọi phụ thuộc vào kiểu của biến được sử dụng để tham khảo đến thể hiện, chứ không phải kiểu của chính thể hiện đó.

Trong hầu hết mọi trường hợp bạn luôn thích override một phương thức hơn là hide nó. Bởi vì hide dễ gây ra những lỗi nghiêm trọng. Nhưng cú pháp C# được thiết kế để bảo đảm cho những nhà phát triển sẽ được cảnh báo trong thời gian biên dịch về vấn đề nghiêm trọng này. Nếu bạn tạo ra hai phương thức hoàn toàn giống nhau ở cả lớp thừa hưởng và lớp cơ sở mà không có khai báo virtual và override thì bạn sẽ bị cảnh báo trong khi biên dịch. Trong C#, bạn nên sử dụng từ khoá new để đảm bảo bạn muốn hide phương thức đó.

Ví dụ 5: Sử dụng phương thức ảo.

---

using System;

publicclass Window {

public Window( int top, int left ) {

this.top = top;

// phương thức được khai báo ảo

publicvirtualvoid DrawWindow() {

Console.WriteLine( “Window: drawing window at {0}, {1}”, top, left ); } (adsbygoogle = window.adsbygoogle || []).push({});

// biến thành viên của lớp

protectedint top;

protectedint left; }

publicclass ListBox : Window {

// phương thức khởi dựng có tham số

public ListBox( int top, int left, string contents ): base( top, left) {

listBoxContents = contents; }

// thực hiện việc phủ quyết phương thức DrawWindow

publicoverridevoid DrawWindow() {

base.DrawWindow();

Console.WriteLine(“ Writing string to the listbox: {0}”, listBoxContents);

}

// phủ quyết phương thức DrawWindow của lớp cơ sở

publicoverridevoid DrawWindow() {

Console.WriteLine(“ Drawing a button at {0}: {1}”, top, left); }

}

publicclass Tester {

staticvoid Main() {

Window win = new Window(1,2);

ListBox lb = new ListBox( 3, 4, “ Stand alone list box”); Button b = new Button( 5, 6 );

win.DrawWindow(); lb.DrawWindow(); b.DrawWindow();

winArray[0] = new Window( 1, 2 );

winArray[1] = new ListBox( 3, 4, “List box is array”); winArray[2] = new Button( 5, 6 );

for( int i = 0; i < 3; i++) { winArray[i].DrawWindow(); } } } --- Kết quả:

Window: drawing window at 1: 2 Window: drawing window at 3: 4

Writing string to the listbox: Stand alone list box Drawing a button at 5: 6

Window: drawing Window at 1: 2 Window: drawing window at 3: 4

Writing string to the listbox: List box is array Drawing a button at 5: 6

Lời kết

Chương này đã giới thiệu đến các bạn cấu trúc của một lớp - thành phần làm nên một chương trình hướng đối tượng - và lập trình hướng đối tượng trong C#. Trong chương này chúng ta đã thảo luận về nội dung cơ bản của lập trình hướng đối tượng nói chung và cách thể hiện nội dung của một lớp là các trường, thuộc tính, phương thức và sự kiện trong C# nói riêng. Ngoài ra nội dung chương còn đề cập đến nhiều vấn đề khác nữa như việc thực hiện kế thừa và nạp chồng… trong một chương trình C#. (adsbygoogle = window.adsbygoogle || []).push({});

Chúng em đã cố gắng hoàn thành chương này với mục đích giúp người đọc có cái nhìn toàn diện về phương pháp lập trình hướng đối tượng và thực hiện nó trên ngôn ngữ lập trình C#. Điều tất yếu là có nhưng sai lầm và thiếu xót. Chúng em mong có được sự góp ý từ thầy cô và các bạn để hoàn thiện sản phẩm của mình.

Danh mục tài liệu tham khảo

Ebook:

1. Bài giảng lập trình C#

Tác giả: Phạm Anh Phương, Phạm Minh Tuấn, Bùi Tấn Lộc(Đại học KHTN-ĐHQG TPHCM) – Nguồn:

http://www.ebook.edu.vn/?page=1.1&view=9461 2. Essential C# 2.0

Tác giả: Mark Michaelis – Nguồn:

http://www.ebook.edu.vn/?page=1.1&view=9331

3. Programming in C#

Tác giả: Aptech Limited. Website:

4. http://www.congdongcviet.com

5. VB.NET và C# (C Shape) - Mạng giáo viên sáng tạo:

http://mspil.net.vn/gvst/forums/86.aspx

6. Lập trình .NET - Thư viện cộng đồng .NET Việt Nam.

PHẦN I: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG. ...1

3.1.1GIỚITHIỆUVỀ LẬPTRÌNHHƯỚNG ĐỐITƯỢNG...2

3.1.2CÁCTÍNHCHẤTCỦALẬPTRÌNHHƯỚNG ĐỐITƯỢNG ...7

3.1.3CÁCKHÁINIỆMTRONGLẬPTRÌNHHƯỚNG ĐỐITƯỢNG ...8

3.1.3.1 Đối tượng ...8

3.1.3.2 Lớp đối tượng...9

3.1.3.3 Trừu tượng hóa dữ liệu (Abstraction)...10

3.1.3.4 Bao gói và che giấu thông tin (Encapsulation and Information Hiding) ...11

3.1.3.5 Sự mở rộng, kế thừa giữa các lớp (Inheritance)...11

3.1.3.6 Đa xạ (tương ứng bội) và nạp chồng (Polymorphism and Overloading)...12

3.1.3.7 Liên kết động (Dynamic binding) ...13

3.1.3.8 Truyền thông điệp (Message Passing)...14

PHẦN II: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C#.NET...15

3.2.1LỚP ...15 3.2.1.1 Định nghĩa lớp ...15 3.2.1.2 Đối tượng ...17 3.2.2THUỘCTÍNH(PROPERTIES): ...19 3.2.3PHƯƠNGTHỨC...24 3.2.3.1 Phương thức static...28 3.2.3.2 Phương thức ảo và đa hình...30 3.2.3.3 Phương thức trừu tượng ...34 3.2.3.4 Phương thức ToString() ...35

3.2.3.5 Hàm tạo (Constructors) và hàm hủy (Destructors) trong C#...36

3.2.4NẠPCHỒNGPHƯƠNGTHỨC ...37 (adsbygoogle = window.adsbygoogle || []).push({});

3.2.5KẾ THỪA ...41

3.2.5.1 Sự kế thừa ...41

Một phần của tài liệu Giáo án - Bài giảng: LẬP TRÌNH HƯỚNG đối TƯỢNG TRONG CSHARP (Trang 43 - 51)