tv_lthdt_c#

51
   w   w   w  .   c    h    i   a   s   e    t    h   o   n   g    t    i   n  .   o   r   g Lờ i mở  đầu Trong chươ ng trình đã hc tr ướ c đây chúng ta đã đượ c làm quen vớ i mt phươ ng pháp l  p trình đã có t r t lâu và đơ n gi n đó là l p trình hướ ng cu trúc. Đối vớ i các chươ ng trình nh thì ph ươ ng pháp này t ươ ng đối hiu qu. Tuy nhiên, ngày nay khi quy mô các ch ươ ng trình máy tính càng l ớ n và độ ph c t p cao thì phươ ng pháp l  p trình truyn thng này tr ở  nên r t kém hiu qu. Và phươ ng pháp l  p trình hướ ng đối tượ ng ra đờ i nhm khc phc nhng nhượ c đim ca phươ ng pháp l  p trình cũ này. L p trình h ướ ng đối tượ ng cung c p 4 tính n ăng t o nên s khác bi t và sc mnh ca nó khi so sánh v ớ i l p trình hướ ng cu trúc là tính tr u tượ ng, tính đóng gói, tính đa hình và tính k ế th a. Đặc bit, khi k ết hợ  p vớ i mt ngôn ng l  p trình mnh hin nay là C#, b  đôi có kh n ăng gii quyết nhng bài toán t đơ n gin đến phc t p nht. Trong chươ ng này, bn s đượ c giớ i thiu v n i dung quan tr ng vớ i tiêu đề là “L  p trình hướ ng đối tượ ng trong C#”. Chươ ng gm 2 phn sau: - Phn I: L p trình hướ ng đối tượ ng. Phn này gi ớ i thiu v ph ươ ng pháp ti ế p cn hướ ng đối tượ ng trong l  p trình vớ i các tính ch t, khái ni m ca nó. - Phn II: L p trình hướ ng đối tượ ng trong C#. Phn này đề c  p đến vi c l  p trình h ướ ng đối t ượ ng trong ngôn ng  l  p trình mnh hin nay là C#, bao gm vic khai báo l ớ  p, thuc tính, cách th c hin các phươ ng thc, k ế tha và n p chng.

Upload: madboy-love

Post on 09-Jul-2015

1.143 views

Category:

Documents


0 download

TRANSCRIPT

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 1/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

Lờ i mở  đầu

Trong chươ ng trình đã học tr ướ c đây chúng ta đã đượ c làm quen vớ imột phươ ng pháp lậ p trình đã có từ r ất lâu và đơ n giản đó là lậ p trình hướ ngcấu trúc. Đối vớ i các chươ ng trình nhỏ thì phươ ng pháp này tươ ng đối hiệuquả. Tuy nhiên, ngày nay khi quy mô các chươ ng trình máy tính càng lớ n vàcó độ phức tạ p cao thì phươ ng pháp lậ p trình truyền thống này tr ở nên r ất kémhiệu quả. Và phươ ng pháp lậ p trình hướ ng đối tượ ng ra đờ i nhằm khắc phụcnhững nhượ c điểm của phươ ng pháp lậ p trình cũ này.

Lậ p trình hướ ng đối tượ ng cung cấ p 4 tính năng tạo nên sự khác biệt vàsức mạnh của nó khi so sánh vớ i lậ p trình hướ ng cấu trúc là tính tr ừu tượ ng,

tính đóng gói, tính đa hình và tính k ế thừa. Đặc biệt, khi k ết hợ  p vớ i một ngônngữ lậ p trình mạnh hiện nay là C#, bộ đôi có khả năng giải quyết những bàitoán từ đơ n giản đến phức tạ p nhất.

Trong chươ ng này, bạn sẽ đượ c giớ i thiệu về nội dung quan tr ọng vớ itiêu đề là “Lậ p trình hướ ng đối tượ ng trong C#”. Chươ ng gồm 2 phần sau:

-  Phần I: Lậ p trình hướ ng đối tượ ng.

Phần này giớ i thiệu về phươ ng pháp tiế p cận hướ ng đối tượ ng trong lậ ptrình vớ i các tính chất, khái niệm của nó.

-  Phần II: Lậ  p trình hướ ng đối tượ ng trong C#. Phần này đề cậ pđến việc lậ p trình hướ ng đối tượ ng trong ngôn ngữ lậ p trình mạnh hiện nay làC#, bao gồm việc khai báo lớ  p, thuộc tính, cách thực hiện các phươ ng thức, k ế thừa và nạ p chồng.

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 2/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 2

Phần I: Lập trình hướ ng đối tượ ng.

3.1.1 Giớ i thiệu về lập trình hướ ng đối tượ ng.

Khái niệm hướ ng đối tượ ng đượ c xây dựng trên nền tảng của khái niệmlậ p trình có cấu trúc và sự tr ừu tượ ng hóa dữ liệu. Sự thay đổi căn bản ở chỗ,một chươ ng trình hướ ng đối tượ ng đượ c thiết k ế xoay quanh dữ liệu mà chúngta có thể làm việc trên đó, hơ n là theo bản thân chức năng của chươ ng trình.Điều này hoàn toàn tự nhiên một khi chúng ta hiểu r ằng mục tiêu của chươ ngtrình là xử lý dữ liệu. Suy cho cùng, công việc mà máy tính thực hiện vẫnthườ ng đượ c gọi là xử lý dữ liệu. Dữ liệu và thao tác liên k ết vớ i nhau ở mộtmức cơ bản (còn có thể gọi là mức thấ p), mỗi thứ đều đòi hỏi ở thứ kia có mụctiêu cụ thể, các chươ ng trình hướ ng đối tượ ng làm tườ ng minh mối quan hệ 

này.Lậ p trình hướ ng đối tượ ng (Object Oriented Programming - gọi tắt là

OOP) hay chi tiết hơ n là Lậ  p trình định hướ ng đối tượ ng, chính là phươ ng pháp lậ p trình lấy đối tượ ng làm nền tảng để xây dựng thuật giải, xây dựngchươ ng trình. Thực chất đây không phải là một phươ ng pháp mớ i mà là mộtcách nhìn mớ i trong việc lậ p trình. Để phân biệt, vớ i phươ ng pháp lậ p trìnhtheo kiểu cấu trúc mà chúng ta quen thuộc tr ướ c đây, hay còn gọi là phươ ng

  pháp lậ  p trình hướ ng thủ tục (Procedure-Oriented Programming), ngườ i lậ ptrình phân tích một nhiệm vụ lớ n thành nhiều công việc nhỏ hơ n, sau đó dần

dần chi tiết, cụ thể hoá để đượ c các vấn đề đơ n giản, để tìm ra cách giải quyếtvấn đề dướ i dạng những thuật giải cụ thể rõ ràng qua đó dễ dàng minh hoạ 

 bằng ngôn ngữ giải thuật (hay còn gọi các thuật giải này là các chươ ng trìnhcon). Cách thức phân tích và thiết k ế như vậy chúng ta gọi là nguyên lý lậ ptrình từ trên xuống (top-down), để thể hiện quá trình suy diễn từ cái chung chođến cái cụ thể.

Các chươ ng trình con là những chức năng độc lậ p, sự ghép nối chúnglại vớ i nhau cho chúng ta một hệ thống chươ ng trình để giải quyết vấn đề đặtra. Chính vì vậy, cách thức phân tích một hệ thống lấy chươ ng trình con làm

nền tảng, chươ ng trình con đóng vai trò trung tâm của việc lậ  p trình, đượ chiểu như phươ ng pháp lậ p trình hướ g về thủ tục. Tuy nhiên, khi phân tích để thiết k ế một hệ thống không nhất thiết phải luôn luôn suy ngh ĩ  theo hướ ng“làm thế nào để giải quyết công việc”, chúng ta có thể định hướ ng tư duy theo

 phong cách “vớ i một số đối tượ ng đã có, phải làm gì để giải quyết đượ c côngviệc đặt ra” hoặc phong phú hơ n, “làm cái gì vớ i một số đối tượ ng đã có đó”,từ đó cũng có thể giải quyết đượ c những công việc cụ thể. Vớ i phươ ng pháp

 phân tích trong đó đối tượ ng đóng vai trò trùng tâm của việc lậ p trình như vậy,ngườ i ta gọi là nguyên lý lậ p trình từ dướ i lên (Bottom-up).

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 3/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 3

Lậ  p trình hướ ng đối tượ ng liên k ết cấu trúc dữ liệu vớ i các thao tác,theo cách mà tất cả thườ ng ngh ĩ về thế giớ i quanh mình. Chúng ta thườ ng gắn

một số các hoạt động cụ thể vớ i một loại hoạt động nào đó và đặt các giả thiếtcủa mình trên các quan hệ đó.

Ví dụ1.1: Để dễ hình dùng hơ n, chúng ta thủ nhìn qua các công trìnhxây dựng hiện đại, như sân vận động có mái che hình vòng cung, những kiếntrúc thẩm m ĩ vớ i đườ ng nét hình cong. Tất cả những sản phẩm đó xuất hiệncùng vớ i những vật liệu xây dựng. Ngày nay, không chỉ chồng lên nhau nhữngviên gạch, những tảng đá để tạo nên những quần thể kiến trúc (như ThápChàm Nha Trang, Kim Tự Tháp,...), mà có thể vớ i bêtông, sắt thép và khôngnhiều lắm những viên gạch, ngườ i xây dựng cũng có thể thiết k ế những công

trình kiến trúc tuyệt mỹ, những toà nhà hiện đại. Chính các chất liệu xây dựngđã làm ảnh hưở ng phươ ng pháp xây dựng, chất liệu xây dựng và nguyên lý k ếtdính caá chất liệu đó lại vớ i nhau cho chúng ta một đối tượ ng để khảo sát,Chất liệu xây dựng và nguyên lý k ết dính các chất liệu lại vớ i nhau đượ c hiểutheo ngh ĩ a dữ liệu và chươ ng trình con tác động trên dữ liệu đó.

Ví dụ1.2: Chúng ta biết r ằng một chiếc xe có các bánh xe, di chuyểnđượ c và có thể đổi hướ ng của nó bằng cách quẹo tay lái. Tươ ng tự như thế,một cái cây là một loại thực vật có thân gỗ và lá. Một chiếc xe không phải làmột cái cây, mà cái cây không phải là một chiếc xe, chúng ta có thể giả thiết

r ằng cái mà chúng ta có thể làm đượ c vớ i một chiếc xe thì không thể làm đượ cvớ i một cái cây. Chẳng hạn, thật là vô ngh ĩ a khi muốn lái một cái cây, cònchiếc xe thì lại chẳng lớ n thêm đượ c khi chúng ta tướ i nướ c cho nó.

Lậ p trình hướ ng đối tượ ng cho phép chúng ta sử dụng các quá trình suyngh ĩ như vậy vớ i các khái niệm tr ừu tượ ng đượ c sử dụng trong các chươ ngtrình máy tính. Một mẫu tin (record) nhân sự có thể đượ c đọc ra, thay đổi vàlưu tr ữ lại; còn số phức thì có thể đượ c dùng trong các tính toán. Tuy vậykhông thể nào lại viết một số phức vào tậ p tin làm mẫu tin nhân sự và ngượ clại hai mẫu tin nhân sự lại không thể cộng vớ i nhau đượ c. Một chươ ng trìnhhướ ng đối tượ ng sẽ xác định đặc điểm và hành vi cụ thể của các kiểu dữ liệu,điều đó cho phép chúng ta biết một cách chính xác r ằng chúng ta có thể cóđượ c những gì ở các kiểu dữ liệu khác nhau.

Chúng ta còn có thể tạo ra các quan hệ giữa các kiểu dữ liệu tươ ng tự nhưng khác nhau trong một chươ ng trình hướ ng đối tượ ng. Ngườ i ta thườ ngtự nhiên phân loại ra mọi thứ, thườ ng đặt mối liên hệ giữa các khái niệm mớ ivớ i các khái niệm đã có, và thườ ng có thể thực hiện suy diễn giữa chúng trêncác quan hệ đó. Hãy quan niệm thế giớ i theo kiểu cấu trúc cây, vớ i các mứcxây dựng chi tiết hơ n k ế tiế p nhau cho các thế hệ sau so vớ i các thế hệ tr ướ c.

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 4/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 4

Đây là phươ ng pháp hiệu quả để tổ chức thế giớ i quanh chúng ta. Các chươ ngtrình hướ ng đối tượ ng cũng làm việc theo một phươ ng thức tươ ng tự, trong đó

chúng cho phép xây dựng các các cơ cấu dữ liệu và thao tác mớ i dựa trên cáccơ cấu có sẵn, mang theo các tính năng của các cơ cấu nền mà chúng dựa trênđó, trong khi vẫn thêm vào các tính năng mớ i.

Lậ  p trình hướ ng đối tượ ng cho phép chúng ta tổ chức dữ liệu trongchươ ng trình theo một cách tươ ng tự như các nhà sinh học tổ chức các loạithực vật khác nhau. Theo cách nói lậ p trình đối tượ ng, xe hơ i, cây cối, các số 

 phức, các quyển sách đều đượ c gọi là các lớ  p (Class).

Một lớ  p là một bản mẫu mô tả các thông tin cấu trúc dữ liệu, lẫn cácthao tác hợ  p lệ của các phần tử dữ liệu. Khi một phần tử dữ liệu đượ c khai báo

là phần tử của một lớ  p thì nó đượ c gọi là một đối tượ ng (Object). Các hàmđượ c định ngh ĩ a hợ  p lệ trong một lớ  p đượ c gọi là các phươ ng thức (Method)và chúng là các hàm duy nhất có thể xử lý dữ liệu của các đối tượ ng của lớ  pđó. Một thực thể (Instance) là một vật thể có thực bên trong bộ nhớ , thực chấtđó là một đối tượ ng (ngh ĩ a là một đối tượ ng đượ c cấ p phát vùng nhớ ).

Mỗi một đối tượ ng có riêng cho mình một bản sao các phần tử dữ liệucủa lớ  p còn gọi là các biến thực thể (Instance variable). Các phươ ng thức địnhngh ĩ a trong một lớ  p có thể đượ c gọi bở i các đối tượ ng của lớ  p đó. Điều nàyđượ c gọi là gửi một thông điệ p (Message) cho đối tượ ng. Các thông điệ p này

 phụ thuộc vào đối tượ ng, chỉ đối tượ ng nào nhận thông điệ p mớ i phải làm việctheo thông điệ p đó. Các đối tượ ng đều độc lậ p vớ i nhau vì vậy các thay đổitrên các biến thể hiện của đối tượ ng này không ảnh hưở ng gì trên các biến thể hiện của các đối tượ ng khác và việc gửi thông điệ  p cho một đối tượ ng nàykhông ảnh hưở ng gì đến các đối tượ ng khác.

 Như vậy, đối tợ ng đượ c hiểu theo ngh ĩ a là một thực thể mà trong đó caádữ liệu và thủ tục tác động lên dữ liệu đã đượ c đóng gói lại vớ i nhau. Hay “đốitượ ng đượ c đặc tr ưng bở i một số thao tác (operation) và các thông tin(information) ghi nhơ sự tác động của các thao tác này.”

Ví dụ 1.3: Khi nghiên cứ về ngăn xế p (stack), ngoài các dữ liệu vùngchứa ngăn xế p, đỉnh của ngăn xế p, chúng ta phải cài đặt kèm theo các thao tácnhư khở i tạo (creat) ngăn xế  p, kiểm tra ngăn xế p r ỗng (empty), đẩy (push)một phần tử vào ngăn xế p, lấy (pop) một phần tử ra khỏi ngăn xế p. Trên quanđiểm lấy đối tượ ng làm nền tảng, rõ ràng dữ liệu và các thao tác trên dữ liệuluôn gắn bó vớ i nhau, sự k ết dính chúng chính là đối tượ ng chúng ta cần khảosát.

Các thao tác trong đối tượ ng đượ c gọi là các phươ ng thức hay hành vicủa đối tượ ng đó. Phươ ng thức và dữ liệu của đối tượ ng luôn tác động lẫn

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 5/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 5

nhau và có vai trò ngang nhau trong đối tượ ng, Phươ ng thức của đối tượ ngđượ c qui định bở i dữ liệu và ngượ c lại, dữ liệu của đối tượ ng đượ c đặt tr ưng

 bở i các phươ ng thức của đối tượ ng. Chính nhờ sự gắn bó đó, chúng ta có thể gở i cùng một thông điệ p đến những đối tượ ng khác nhau. Điều này giúp ngườ ilậ p trình không phải xử lý trong chươ ng trình của mình một dãy các cấu trúcđiều khiển tuỳ theo thông điệ p nhận vào, mà chươ ng trình đượ c xử lý vào thờ iđiểm thực hiện.

Lậ p trình hướ ng đối tượ ng là một mô hình có ưu thế trong những nămgần đây, thay thế cho "structured", công nghệ lậ p trình hướ ng thủ tục là côngnghệ mà đã đượ c phát triển từ những năm 1970. Java là tổng hoà của hướ ngđối tượ ng và nó không thể lậ p trình theo kiểu hướ ng thủ tục mà bạn đã thoải

mái và quen thuộc vớ i nó. Chúng tôi hi vọng vớ i phần này - đặc biệt khi tổnghợ  p cùng vớ i các ví dụ đượ c hỗ tr ợ trong text và các website quen thuộc - sẽ giúp bạn đủ thông tin về OOP để tr ở  thành đồng môn vớ i Java.

Chúng ta sẽ bắt đầu vớ i câu hỏi đó, trên bề mặt, dườ ng như không có thứ  j làm vớ i lậ p trình: Làm thế nào mà các công ty như Compad, Dell, Gatewayvà các nhà sản xuất máy tính cá nhân khác lại tr ở nên lớ n và nhanh đến vậy?Hầu hết mọi ngườ i đều cho r ằng họ làm ra những máy tính tốt và bán chúngvớ i giá r ẻ  ở  k ỉ nguyên mà máy tính tr ở  nên phát triển nhanh và gấ  p gáp.

 Nhưng trong tươ ng lai - họ đã sản xuất r ất nhiều mô hình nhanh và đáp ứng lạisự thay đổi nhanh chóng?

Một phần lớ n của câu tr ả lờ i là những công ty này đã làm r ất nhiều việc.Họ đã mua các thiết bị từ sự tin cậy của các đại lý và sau đó tậ p trung họ. Họ thườ ng không đầu tư thờ i gian và tiền bạc cho việc thiết k ế và xây dựng sứcmạnh của hàng cung cấ p, ổ đĩ a, motherboard và các thiết bị khác. Điều này tạocho các công ty sản xuất ra một sản phẩm và tạo sự thay đổi một cách nhanhchóng mà ít tốn kém tiền bạc nhất hơ n là họ làm k  ĩ  sư cho chính họ.

Các nhà sản xuất máy tính cá nhân đã mua "các chức năng đã đượ c đónggói". Ví dụ, khi họ mua một bộ nguồn, họ đang mua một cái j đấy vớ i cácthuộc tính (kích cỡ , hình dạng và ...) và tất nhiên chức năng (bộ nguồn tốt, số 

 power hiển thị và những điều khác). Compad cung cấ p một ví dụ cụ thể về cách nó hoạt động hiệu quả. Khi Compad chuyển từ k  ĩ nghệ hầu hết các phầntrong máy để mua các phần khác, nó cải thiện từ dướ i.

OOP Springs từ cùng một ý tướ ng. Chươ ng trình của bạn đượ c làm từ các object vớ i các thuộc tính và các hoạt động mà các object có thể thực hiện.Khi bạn xây dựng một object hoặc mua nó thì phụ thuộc vào túi của bạn hoặcđúng giờ (tức là dung lượ ng bộ nhớ và thờ i gian). Nhưng về cơ bản, nó đủ để các object thoả mãn các đặc tả của bạn, bạn không phải quan tâm chức năngđượ c bổ sung. Trong OOP, bạn chỉ quan tâm về các object bộc lộ những điểm

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 6/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 6

  j. Vì thế, những nhà sản xuất máy tính không quan tâm bên trong về nguồncung cấ p lâu như những j họ muốn, hầu hết các ngườ i lậ p trình Java không

quan tâm cách một object đượ c bổ sung những j mà họ muốn.Cấu trúc lậ p trình truyền thống bao gồm thiết k ế một tậ p hợ  p các thủ tục

(hoặc giải thuật) để giải quyết vấn đề. Sau khi các thủ tục đượ c xác định, bướ ctiế p theo là tìm cách k ết hợ  p để lưu giữ data. Điều này là điều giải thích nhàthiết k ế ngôn ngữ Pascal, Niklaus Wirth, gọi quyển sách nổi tiếng về lậ p trìnhcủa ông Giải thuật và Cấu trúc dữ liệu = Lậ p trình (Prentice Hall, 1975).

Chú ý r ằng tribg tuêy đề của Wirth, giải thuật đi tr ướ c và cấu trúc dữ liệu đến sau. Cách này giống như các nhà lậ p trình làm việc ở  thờ i gian đó.Tr ướ c tiên, bạn quyết định cách thao tác vớ i dữ liệu, sau đó bạn quyết định

cấu trúc nào ép các dữ liệu này để việc thao tác dễ dàng hơ n. OOP giữ việcsắ p xế p và và put data vào tr ướ c sau đó mớ i dùng các giải thuật thao tác trêndữ liệu. (Ngượ c vớ i Pascal).

Chìa khoá tạo nên sản phẩm trong OOP là tạo mỗi object sự phản hồiđi cùng vớ i một tậ p hợ  p các nhiệm vụ có liên quan. Nếu một object giảm nhẹ một nhiệm vụ mà không thuộc trách nhiệm của nó, nó cần access đến mộtobject khác chịu trách nhiệm đó. Object đầu tiên đề nghị object thứ hai mangnhiệm vụ ra ngoài. Nó đượ c thực hiện vớ i phiên bản tổng quát mà thủ tục gọi -

 bạn thườ ng quen thuộc vớ i lậ p trình hướ ng thủ tục( Gọi lại trong ngôn ngữ lậ p

trình Java, các thủ tục này thườ ng đượ c gọi là method calls).Về cá nhân, một object tốt nhất không bao giờ thao tác tr ực tiế p vớ i dữ 

liệu bên trong của object khác, cũng không nên lộ dữ liệu cho object khác xử lý tr ực tiế p. Tất cả mọi việc giao tiế p nên thông qua method. Bằng cách đónggói dữ liệu object, bạn giảm đượ c tối đa, giảm sự phụ thuộc dữ liệu, thờ i giandebug rút ngắn lại.

Tất nhiên, giống như module trong ngôn ngữ hướ ng thủ tục, bạn sẽ không muốn một object cá nhân làm quá nhiều. Cả việc thiết k ế và debug đềutr ở nên đơ n giản khi bản xây dựng các object nhỏ để thực hiện vài nhiệm vụ,

hơ n là xây dựng các object vớ i các dữ liệu bên trong cực kì phức tạ p vớ i hàngtr ăm các thủ tục thao tác dữ liệu.

Tóm lại, so sánh lậ p trình cấu trúc vớ i chươ ng trình con làm nền tảng:

Chươ ng trình = Cấu trúc dữ liệu + Thuật giải

Trong lậ p trình hướ ng đối tượ ng chúng ta có:

Đối tượ ng = Phươ ng thức + Dữ liệu

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 7/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 7

3.1.2 Các tính chất của lập trình hướ ng đối tượ ng:

Đối tượ ng (object): Các dữ liệu và chỉ thị đượ c k ết hợ  p vào một đơ n vị 

đầy đủ tạo nên một đối tượ ng. Đơ n vị này tươ ng đươ ng vớ i một chươ ng trìnhcon và vì thế các đối tượ ng sẽ đượ c chia thành hai bộ phận chính: phần các

 phươ ng thức (method) và phần các thuộc tính (property). Trong thực tế, các phươ ng thức của đối tượ ng là các hàm và các thuộc tính của nó là các biến,các tham số hay hằng nội tại của một đối tượ ng (hay nói cách khác tậ p hợ  pcác dữ liệu nội tại tạo thành thuộc tính của đối tượ ng). Các phươ ng thức là

 phươ ng tiện để sử dụng một đối tượ ng trong khi các thuộc tính sẽ mô tả đốitượ ng có những tính chất gì.

Các phươ ng thức và các thuộc tính thườ ng gắn chặt vớ i thực tế các đặc

tính và sử dụng của một đối tượ ng. Trong thực tế, các đối tượ ng thườ ng đượ ctr ừu tượ ng hóa qua việc định ngh ĩ a của các lớ   p (class). Tậ p hợ  p các giá tr ị hiện có của các thuộc tính tạo nên tr ạng thái của một đối tượ ng. Mỗi phươ ngthức hay mỗi dữ liệu nội tại cùng vớ i các tính chất đượ c định ngh ĩ a (bở i ngườ ilậ p trình) đượ c xem là một đặc tính riêng của đối tượ ng. Nếu không có gì lầmlẫn thì tậ p hợ  p các đặc tính này gọi chung là đặc tính của đối tượ ng.

 Lậ p trình hướ ng đố i t ượ ng là một phươ ng pháp l ậ p trình có các tínhchấ t chính sau:

a) Tính tr ừ u t ượ ng (abstraction): Đây là khả năng của chươ ng trình bỏ qua hay không chú ý đến một số khía cạnh của thông tin mà nó đang tr ực tiế plàm việc lên, ngh ĩ a là nó có khả năng tậ p trung vào những cốt lõi cần thiết.Mỗi đối tượ ng phục vụ như là một "động tử" có thể hoàn tất các công việc mộtcách nội bộ, báo cáo, thay đổi tr ạng thái của nó và liên lạc vớ i các đối tượ ngkhác mà không cần cho biết làm cách nào đối tượ ng tiến hành đượ c các thaotác. Tính chất này thườ ng đượ c gọi là sự tr ừu tượ ng của dữ liệu.

Tính tr ừu tượ ng còn thể hiện qua việc một đối tượ ng ban đầu có thể cómột số đặc điểm chung cho nhiều đối tượ ng khác như là sự mở  r ộng của nónhưng bản thân đối tượ ng ban đầu này có thể không có các biện pháp thi hành.

Tính tr ừu tượ ng này thườ ng đượ c xác định trong khái niệm gọi là lớ   p tr ừutượ ng hay hay lớ  p cơ sở tr ừu tượ ng.

b) Tính đ óng gói (encapsulation) và che d ấ u thông tin (information

hiding): Tính chất này không cho phép ngườ i sử dụng các đối tượ ng thay đổitr ạng thái nội tại của một đối tượ ng. Chỉ có các phươ ng thức nội tại của đốitượ ng cho phép thay đổi tr ạng thái của nó. Việc cho phép môi tr ườ ng bênngoài tác động lên các dữ liệu nội tại của một đối tượ ng theo cách nào là hoàntoàn tùy thuộc vào ngườ i viết mã. Đây là tính chất đảm bảo sự toàn vẹn củađối tượ ng.

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 8/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 8

c) Tính đ a hình (polymorphism): Thể hiện thông qua việc gửi cácthông điệ p (message). Việc gửi các thông điệ p này có thể so sánh như việc gọi

các hàm bên trong của một đối tượ ng. Các phươ ng thức dùng tr ả lờ i cho mộtthông điệ p sẽ tùy theo đối tượ ng mà thông điệ p đó đượ c gửi tớ i sẽ có phảnứng khác nhau. Ngườ i lậ  p trình có thể định ngh ĩ a một đặc tính (chẳng hạnthông qua tên của các phươ ng thức) cho một loạt các đối tượ ng gần nhaunhưng khi thi hành thì dùng cùng một tên gọi mà sự thi hành của mỗi đốitượ ng sẽ tự động xảy ra tươ ng ứng theo đặc tính của từng đối tượ ng mà không

 bị nhầm lẫn.

Thí dụ khi định ngh ĩ a hai đối tượ ng "hinh_vuong" và "hinh_tron" thì cómột phươ ng thức chung là "chu_vi". Khi gọi phươ ng thức này thì nếu đối

tượ ng là "hinh_vuong" nó sẽ tính theo công thức khác vớ i khi đối tượ ng là"hinh_tron".

d) Tính k ế thừ a (inheritance): Đặc tính này cho phép một đối tượ ng cóthể có sẵn các đặc tính mà đối tượ ng khác đã có thông qua k ế thừa. Điều nàycho phép các đối tượ ng chia sẻ hay mở  r ộng các đặc tính sẵn có mà không

 phải tiến hành định ngh ĩ a lại. Tuy nhiên, không phải ngôn ngữ định hướ ng đốitượ ng nào cũng có tính chất này.

3.1.3 Các khái niệm trong lập trình hướ ng đối tượ ng3.1.3.1 Đối tượ ng

Đối tượ ng là thực thể của hệ thống, của CSDL và đượ c xác định thôngqua định danh ID ( IDentifier ) của chúng.

Mỗi đố i t ượ ng có t ậ p các đặ c tr ư ng bao g ồm:

Các phần tài sản thườ ng là các dữ liệu thành phần hay các thuộc tínhmô tả các tính chất và các phươ ng thức. 

Các thao tác trên các dữ liệu để xác định hành vi của đối tượ ng đó.

Các mối quan hệ vớ i các đối tượ ng của các lớ  p khác.

 Như vậy, đối tượ ng đượ c định ngh ĩ a một cách tr ừu tượ ng như là mộtkhái niệm, một cấu trúc gộ p chung cả phần dữ liệu (thuộc tính) vớ i các hàm(phươ ng thức) thao tác trên những dữ liệu đó và có thể trao đổi vớ i những đốitượ ng khác.

Đối tượ ng là những thực thể đượ c xác định trong thờ i gian hệ thốnghướ ng đối tượ ng hoạt động. Như vậy, đối tượ ng có thể biểu diễn cho ngườ i,vật, hay một bảng dữ liệu hoặc bất k ỳ một hạng thức nào đó cần xử lý trongchươ ng trình.

Mỗi đối tượ ng chỉ tồn tại trong thờ i gian nhất định trong hệ thống.

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 9/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 9

3.1.3.2 Lớ p đối tượ ng

 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, ngh ĩ a là có các thuộc tính và hành vi giốngnhau. Mỗi đối tượ ng chính là thể hiện (một cá thể, đại diện) của một lớ  p xácđịnh.Phươ ng pháp lậ p trình hướ ng đố i t ượ ng là cách phân chia chươ ng trìnhthành các đơ n thể (các lớ  p) bằng cách tạo ra các vùng bộ nhớ cho cả dữ liệulẫn hàm và chúng sẽ đượ c sử dụng như các mẫu để tạo ra bản sao từng đốitượ ng khi chúng đượ c tạo ra trong hệ thống.

Lớ  p chính là tậ p các đối tượ ng có cùng các thuộc tính và hành vi giốngnhau. Các thành phần của lớ  p có thể chia thành ba vùng quản lý chính:

+ Công khai ( public),

+ Đượ c bảo vệ ( protected ),

+ Riêng ( private).

Con ngườ i

Tên: Nam

Tuổi: 28Tr ọng lượ ng: 65 kgs

Hành động:Đi

 NóiSuy ngh ĩ  

Xe máy

 

Loại: Future

Màu: Đỏ  Năm: 1995

Hành động:Khở i động

 NgừngChuyển động 

Hình: Một đối tượng Con người và một đối tượng Xe máy 

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 10/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 10

 Chú ý: S ự khác bi ệ t thự c sự gi ữ a một l ớ  p và một đố i t ượ ng:

  Một lớ  p định ngh ĩ a một thực thể, trong khi đó một đối tượ ng là mộttr ườ ng hợ  p của thực thể ấy.

  Đối tượ ng là một mô hình thực, trong khi lớ  p là một mô hình khái niệm- định ngh ĩ a tất cả các thuộc tính và các phươ ng thức cần thiết của mộtđối tượ ng.

  Tất cả các đối tượ ng thuộc về cùng một lớ  p có cùng các thuộc tính vàcác phươ ng thức.

  Một lớ  p là một nguyên mẫu của một đối tượ ng. Nó xác định các hànhđộng khả thi và các thuộc tính cần thiết cho một nhóm các đối tượ ng cụ thể 

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

Quá trình tr ừu tượ ng hoá chỉ tậ p trung vào những tính chất chung nhất,chính nhất và bỏ qua những chi tiết vụn vặt. Ta nói r ằng từ mô hình dữ liệu cóthể dẫn ra những kiể u d ữ  liệu tr ừ u t ượ ng.Kiể u d ữ  liệu tr ừ u t ượ ng là một môhình dữ liệu dựa trên những những đặc tính chính và một số phép toán xácđịnh trên những cấu trúc dữ liệu đã lựa chọn, phục vụ cho việc giải một lớ  pcác bài toán nào đó. Tr ừ u t ượ ng hóa là sự mở r ộng khái niệm kiểu dữ liệu vàcho phép định ngh ĩ a những phép toán tr ừu tượ ng trên các dữ liệu tr ừu tượ ng.Khi xây dựng phần mềm thì nguyên lý tr ừu tượ ng hoá đượ c thực hiện thôngqua việc tr ừu tượ ng hoá các chức năng, hàm (thuật toán) và tr ừu tượ ng hoácác kiểu dữ liệu nguyên thuỷ.

Lớ p Con ngườ i

- Tên: Kiể u chuỗ i - Tuổi: Kiể u sốố  - Tr ọng lượ ng: Kiể u sốố  

. Đi

. Nói

. Suy ngh ĩ  

Lớ p Xe máy

- Loại: Kiể u chuỗ i - Màu: Kiể u chuỗ i - Năm: Kiể u sốố  

. Khở i động

. Ngừng

. Chuyển động 

Hình: Một Lớ  p Con ngườ i và một Lớ  p Xe máy

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 11/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 11

3.1.3.4 Bao gói và che giấu thông tin (Encapsulation and InformationHiding)

Việc đóng gói d ữ  liệu và các hàm vào một đơ n vị cấ u trúc (gọi là lớ  p)đượ c xem như một nguyên tắc bao gói thông tin. K ỹ thuật này cho phép xácđịnh các vùng đặc tr ưng riêng, công khai hay đượ c bảo vệ bao gồm cả dữ liệuvà các câu lệnh nhằm đ iề u khiể n hoặ c hạn chế nhữ ng truy nhậ p tùy tiện củanhững đối tượ ng khác. Đóng gói d ữ  liệu và các hàm vào một đơ n vị cấ u trúc (gọi là lớ  p) đượ c xem như một nguyên tắc bao bọc thông tin. Các hàm thành

 phần công khai của l ớ  p sẽ  đ óng vai trò như là giao diện giữ a các đố i t ượ ng vàvớ i phần còn lại của hệ thống. Nguyên tắc bao bọc dữ liệu để ngăn cấm sự truy nhậ p tr ực tiế p trong lậ p trình đượ c gọi là sự che giấ u thông tin.

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

  Nguyên lý k ế thừ a cho phép các đối tượ ng của lớ p này đượ c quyềnsử dụng một số tính chất (cả dữ liệu và các hàm thành phần) của cáclớ  p khác.

  Một lớ p có thể là l ớ  p con (l ớ  p d ẫ n xuất) của một lớ p khác, ngh ĩ a làcó thể bổ sung thêm một số tính chất để thu hẹ p phạm vi xác định cácđối tượ ng trong lớ  p mớ i cho phù hợ  p vớ i ngữ cảnh trong thực tế.

 

Dữ liệu riêng

Hàm riêng

Dữ liệu công khai

Hàm công khai

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 12/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 12

  Theo nguyên lý chung của k ế thừa thì chỉ  nhữ ng thuộc tính, hàm

thành phần đượ c bảo vệ  và công khai là đượ c quyề n k ế  thừ a, còn nhữ ng

thuộc tính, hàm thành phần riêng là không đượ c phép k ế thừ a.Phươ ng pháp hướ ng đối tượ ng nói chung hỗ tr ợ hai nguyên lý k ế thừa:

  K ế thừ a đơ n: một lớ  p có thể k ế thừa từ một lớ  p cơ sở  

  K ế thừ a bội : một lớ  p có thể k ế thừa từ nhiều hơ n một lớ  p cơ sở .

Có thể diễn đạt cơ chế k ế thừa như sau:

  Bổ sung thêm một số thuộc tính, hàm để mô tả đượ c đúng cáchành vi của những đối tượ ng mà lớ  p A quản lý.

  Lớ  p A k ế thừa lớ  p B sẽ có (không tườ ng minh) tất cả các thuộctính, hàm đã đượ c xác định trong B, ở những vùng đượ c phép k ế thừa (đượ c

 bảo vệ, công khai),

Có thể diễn đạt cơ chế k ế thừa như sau:

+ Lớ  p A k ế thừa lớ  p B sẽ có (không tườ ng minh) tất cả các thuộctính, hàm đã đượ c xác định trong B, ở những vùng đượ c phép k ế thừa (đượ c

 bảo vệ, công khai),

+ Bổ sung thêm một số thuộc tính, hàm để mô tả đượ c đúng cáchành vi của những đối tượ ng mà lớ  p A quản lý.

+ Viết đè (thay đổi hành vi ứng xử) của các hàm đượ c k ế thừa.

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

 Đa xạ là k ỹ thuật đượ c sử dụng để mô tả khả nă ng g ử i một thông đ iệ pchung t ớ i nhiề u đố i t ượ ng mà mỗ i đố i t ượ ng l ại có cách xử lý riêng theo

ng ữ cảnh của mình.

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 13/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 13

 

 Đa xạ đóng một vai trò quan tr ọng trong việc tạo ra các đối tượ ng cócấu trúc vớ i những nội dung thực hiện khác nhau mà lại có khả năng sử dụngchung một giao diện (cùng một tên gọi). Theo một ngh ĩ a nào đó, đa xạ là sự mở r ộng khái niệm sử dụng lại trong nguyên lý k ế thừa.

  Nạ p chồng (Overloading ) là một tr ườ ng hợ  p của đa xạ: một khái niệm(như các phép toán chẳng hạn) có thể đượ c sử dụng vớ i nhiều nội dung thựchiện khác nhau tùy theo ngữ cảnh, cụ thể là tuỳ thuộc vào kiểu và số các tham

số của chúng. Ví dụ:

int Cong(int, int); // Cộng hai số nguyên 

float Cong(float, float); // Cộng hai số thự c 

Complex Cong(Complex, Complex); // Cộng hai số phứ c 

String Cong(String, String); // Ghép hai xâu 

String Cong(String, int); // Ghép một xâu vớ i một số 

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

  Liên k ết thông thườ ng (liên k ết t ĩ nh) là dạng liên k ết đượ c xác địnhngay khi dịch chươ ng trình.

   Liên k ế t động  là dạng liên k ết các hàm, chức năng khi chươ ng trìnhthực hiện các lờ i gọi các hàm, chức năng đó theo ngữ cảnh hiện thờ i.

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 14/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 14

  Trong liên k ết động, nội dung của đoạn chươ ng trình ứng vớ i chứcnăng, hàm sẽ không đượ c xác định cho đến khi các lờ i gọi hàm đượ c

thực hiện theo ngữ cảnh lúc thực hiện.3.1.3.8 Truyền thông điệp (Message Passing)

Chươ ng trình hướ ng đối tượ ng bao gồm một tậ p các đối tượ ng và mốiquan hệ giữa các đối tượ ng đó vớ i nhau. Lậ p trình trong ngôn ngữ hướ ng đốitượ ng bao gồm các bướ c sau:

  Tạo ra các lớ  p đối tượ ng và mô tả hành vi của chúng,

  Tạo ra các đối tượ ng theo định ngh ĩ a của các lớ  p,

  Xác định sự trao đổi thông tin giữa các đối tượ ng trong hệ thống.

 Nguyên lý trao đổi thông tin bằng cách truyền thông điệ p cho phépchúng ta dễ dàng xây dựng đượ c hệ thống mô phỏng gần hơ n vớ i thực tế.Truyền thông điệ p cho một đối tượ ng tức là báo cho nó phải thực hiện mộtviệc, một yêu cầu (thỉnh cầu) nào đó. Cách ứng xử của đối tượ ng sẽ đượ c môtả ở trong lớ  p thông qua các hàm công khai (hay còn đượ c gọi là lớ  p dịch vụ).

Trong chươ ng trình, thông điệ p gửi đến cho một đối tượ ng chính là để yêu cầu thực hiện một công việc cụ thể, ngh ĩ a là sử dụng những hàm tươ ngứng để xử lý dữ liệu đã đượ c khai báo trong lớ  p đối tượ ng đó.

Ví dụ, khi hệ thống máy tính muốn in một tệ p dataFile thì máy tínhhiện thờ i (:Computer ) gửi đến cho đối tượ ng :PrinterServer  một yêu cầu Print(dataFile).

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 15/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 15

Phần II: Lập trình hướ ng đối tượ ng vớ i C#.NET

3.2.1 Lớ p

3.2.1.1 Định ngh ĩ a lớ p

Class – là một định ngh ĩ a cho một kiểu của ngườ i dùng (user-definedtype – UDT). Class hay còn gọi là lớ  p là sự gói gọn các dữ liệu và phươ ngthức (method ) hoạt động trên dữ liệu đó.Trong C# lớ  p đượ c coi là kiểu dữ liệu tham chiếu( reference) và như vậy các thể hiện( instance) của lớ  p sẽ đượ cchứ ở vùng nhớ heap và đượ c quản lí bở i bộ thu gom rác( GC). Khi một thể hiện của lớ  p đượ c tạo thì nó sẽ đượ c phân phối vùng nhớ  trên heap và cáctham chiếu đến đối tượ ng bắt đầu đượ c đếm. Khi số đếm tham chiếu bằng 0

thì GC sẽ phục hồi vùng nhớ bị chiếm bở i đối tượ ng và tr ả bộ nhớ sang tr ạngthái sẵn sàng để sử dụng.

Class có thể chứa: các tr ườ ng(fields), các phươ ng thức(methods), cácthuộc tính(properties), sự kiện (events), và các lớ  p lồng nhau. Lớ  p có thể đượ cthừa k ế từ những lớ  p khác và phát triển đa giao diện (multiple interfaces).

Lớ  p ảo (abstract class) không thể tạo tr ực tiế  p nhưng cung cấ  p cácthuộc tính để lớ  p k ết thừa định ngh ĩ a. Lớ  p thật (concrete class) đượ c tạo tr ựctiế p.

Định ngh ĩ a một lớ  p mớ i vớ i cú pháp như sau:

[attribute] [bổ từ truy xuất] class <tên của lớ p> [:lớ p cơ sở ]

{

thân lớ p

}

Trong đó:

Bổ từ truy xuất

Bổ từ truy xuất xác định thành viên (nói tắt của biến thành viên và phươ ng thức thành viên) nào của lớ  p đượ c truy xuất từ lớ  p khác. Có các loạikiểu truy xuất sau:

Từ khóa  Giải thích 

  public Truy xuất mọi nơ i

  protected Truy xuất trong nội bộ lớ  p hoặc trong các lớ  p con

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 16/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 16

internal Truy xuất nội trong chươ ng trình (assembly)

 protectedinternal Truy xuất nội trong chươ ng trình (assembly) vàtrong các lớ  p con.

  private( mặcđịnh)

Chỉ đượ c truy xuất trong nội bộ lớ  p

Bảng 3.2-1 Các bổ từ truy xuất

Thân lớ p

Trong thân lớ   p là các chức năng đượ c định ngh ĩ a trong lớ   p như: phươ ng

thức(methods), các thuộc tính(properties), constructor, hay các nạ p chồng toánhạng(Operator Overloads).

Attribute Một attribute là 1 thứ dùng để  đánh dấu (marker) mà đượ c ứng

dụng đến 1 phươ ng thức hay 1 lớ  p thậm chí là 1 đối số riêng trong 1 phưongthức ,cung cấ p thông tin thêm về mục đó. ví dụ attribute Conditional có thể đượ c dùng để đánh dấu 1 phươ ng thức như là 1 phươ ng thức debug như sau :

[Conditional("DEBUG")] public void DoSomeDebugStuff()

{// do something}

Để áp dụng 1 attribute đến 1 mục ta cung cấ p tên của attribute trongngoặc vuông ngay tr ướ c định ngh ĩ a mục. Các attribute lấy vài thông số -những thông số này cung cấ p bên trong dấu ngoặc theo sau tên attribute. Ở cấ p độ cơ bản nhất của nó, ứng dụng 1 attribute vào 1 mục có thể đơ n giản chỉ là thông tin thêm về mục đó đựợ c bỏ trong assembly đuợ c biên dịch dùng chomục đích hướ ng dẫn thêm. 1 số attribute đượ c định ngh ĩ a trong các lớ  p cơ sở  

đượ c nhận ra bở i trình biên dịch C#.mà từ đó trình biên dịch có thể gây ranhững tác động trên mã. Ví dụ trên trình biên dịch sẽ biên dịch mã của mụcConditional chỉ nếu biểu tượ ng DEBUG đã đượ c định ngh ĩ a tr ướ c. Trong

 phần này ta sẽ xem xét 3 attribute sau :

-  Conditional: có thể  đánh dấu bất kì phươ ng thức vớ i attributeConditional. Sẽ ngăn ngừa trình biên dịch từ việc biên dịch phươ ng thức đóhay bất kì câu lệnh mà tham khảo đến nó nếu tên biểu tượ ng không đượ c địnhngh ĩ a. Điều này có thể đượ c dùng cho điều kiện biên dịch.

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 17/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 17

-  Dllimport - đôi khi ta cần truy nhậ p đến các Window API cơ bản hoặccác hàm kiểu cũ khác mà đượ c thực thi trong các window DLLs.attribute.

Dllimport dùng cho mục đích này. Nó đượ c dùng đánh dấu 1 phươ ng thứcđượ c định ngh ĩ a trong Dll bên ngoài.

-  Obsolete - attribute này đượ c dùng để đánh dấu 1 phươ ng thức đượ cxem như obsolete ( không dùng nữa). Tuỳ thuộc vào việc thiết lậ  p trênattribute này, trình biên dịch sẽ sinh ra 1 cảnh báo hay lỗi nếu nó gặ p bất kìmã nào cố gắng dùng phươ ng thức này.

Ví dụ 3.2-1: Khai báo một lớ  p

 public class MyClass{

 public static int Main( ){...}

}

3.2.1.2 Đối tượ ng

Khi khai báo một lớ  p ta định ngh ĩ a các đặc tính chung của tất cả các đốitượ ng của lớ  p và các hành vi của chúng. Object  – chỉ đơ n giản là một thuật

ngữ chỉ về một thực thể (instance) của một class nào đó trong bộ nhớ . Đốitượ ng là một tr ị có thể đượ c tạo ra, lưu giữ và sử dụng. Trong C# tất cả các

 biến đều là đối tượ ng. Các biến kiểu số, kiểu chuỗi … đều là đối tượ ng. Mỗimột đối tượ ng đều có các biến thành viên để lưu giữ dữ liệu và có các phươ ngthức (hàm) để tác động lên biến thành viên. Mỗi đối tượ ng thuộc về một lớ  pđối tượ ng nào đó. Các đối tượ ng có cùng lớ  p thì có cùng các biến thành viênvà phươ ng thức.

Tạo một đối tượ ng bằng cách khai báo kiểu và sau đó dùng từ khoá newđể tạo cú pháp như sau:

<tên kiểu> <tên đối tượ ng> = new <tên lớ p>Ví dụ 3.2-2: Khai báo, tạo và sử dựng một lớ  p

using System; public class Time{// phươ ng thức public

 public void DisplayCurrentTime( ){

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 18/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 18

Console.WriteLine( "stub for DisplayCurrentTime" );}

// các biến privateint Year; int Month; int Date;int Hour; int Minute; int Second;}

 public class Tester {static void Main( ){Time t = new Time( );t.DisplayCurrentTime( );

}}Các lớ  p và hàm Abstract :

C# cho phép cả lớ  p và phươ ng thức có thể khai báo abstract . Một lớ  pabstract không đượ c thể hiện và một phươ ng thức abstract không đượ c thựcthi mà phải đượ c overriden trong bất k ỳ lớ  p thừa hưở ng không abstract nào.Một phươ ng thức abstract sẽ tự động đượ c khai báo virtual . Nếu một lớ  p có

 phươ ng thức abstract thì nó cũng là lớ  p abstract và đượ c khai báo như sau:

abstract class Building{ public abstract decimal CalculateHeatingCost(); // abstract method

}Sealed các lớ  p và phươ ng thức:

C# cho phép các lớ  p và phươ ng thức đượ c khai báo sealed . Nếu là lớ  pcó ngh ĩ a là bạn không đượ c quyền thừa k ế lớ  p đó, nếu là phươ ng thức tức là

 bạn không đượ c phép override nó. C# sử dụng từ khoá sealed tr ướ c tên lớ  p và phươ ng thức:

sealed class FinalClass{//etc}class DerivedClass : FinalClass // wrong. Will give compilation error {//etc}class MyClass

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 19/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 19

{Public sealed override void FinalMethod()

{//etc}}Class DerivedClass : MyClass{

 public override void FinalMethod() // wrong. Will give compilation error {}

 

}Chú ý: Trong C#, nếu bạn không chỉ rõ r ằng một lớ  p đượ c thừa k ế từ 

một lớ  p khác thì trình biên dịch sẽ tự động hiểu r ằng lớ  p của bạn thừa k ế từ lớ  p Object . Đều này có ngh ĩ a là ngoài những thuộc tính và phươ ng thức mà

 bạn định ngh ĩ a thì bạn có thể truy cậ p đến những phươ ng thức protected và public của lớ  p Object . Và những phươ ng thức này cũng có trong tất cả lớ  p mà bạn định ngh ĩ a.

3.2.2 Thuộc tính(properties):

Để định ngh ĩ a thuộc tính trong C# bạn dùng cú pháp sau:

[bổ từ truy xuất] <kiểu trả về> <tên thuộc tính>

{

[get { statement;}]

[set { statement;}]

}

Trong lớ   p trình C++, thông thưòng để đọc hoặc gán giá tr ị cho biếnthành viên, lậ p trình viên thườ ng viết hai hàm get và set tươ ng ứng cho biến.

C# cung cấ p khai báo hàm chung gọi là property cho hàm get và set. Ví dụ:trong lớ   p DocGia có biến thành viên m_sHoTen, cài đặt Property cho biếnthành viên này như sau:

 public string HoTen{get { return m_sHoTen; }set { m_sHoTen = value; }}

Property có một vài khác biệt so vớ i hàm thành viên. Thứ nhất khai báo

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 20/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 20

Property không có tham số và cặ  p ngoặc. Trong thân property dùng hai từ khóa get/set tươ ng ứng cho hai hành động lấy/thiết đặt giá tr ị thuộc tính.

Phươ ng thức set thiết lậ p giá tr ị một property của đối tượ ng và có tr ị tr ả về làvoid. Phươ ng thức set có thể ghi vào cơ  sở dữ liệu hay cậ p nhật biến thànhviên khi cần. Trong thân set, có biến mặc định là value, biến này sé mang kiểuđã đượ c khai báo property, như trong tr ườ ng hợ  p trên là string. Biến value sénhận giá tr ị đượ c gán cho Property. Thân của phươ ng thức truy cậ p get cũnggiống như các phươ ng thức khác nhưng phươ ng thức này tr ả vể một đối tượ ngkiểu là một đặc tính của lớ  p. Cách sử dụng một Property như sau:1 // trong thân của một hàm2 DocGia dgMoi = new DocGia();3

4 // sử dung property set5 dgMoi.HoTen = "Nguyễn Văn A";67 // sử dụng property get

8 string ten = dgMoi.HoTen; //ten có giá tr ị "Nguyễn Văn A"

Ở dòng mã thứ 5, khối set trong property HoTen sẽ đượ c gọi, biến valuesẽ có giá tr ị của biến nằm sau phép gán (trong tr ườ ng hợ  p này là "Nguyễn VanA"). Nếu trong thân hàm không cài đặt hàm set, property sẽ có tính chỉ đọc,

 phép gán sẽ bị cấm. Ngượ c lại nếu không cài đặt hàm get, property sẽ có tínhchỉ ghi.

Public string SomeProperty{

get{

return “This is the property value”;}set {

// do whatever needs to be done to set the property}

}

Có sự hạn chế thông thườ ng ở  đây là: Thủ tục get không có tham số và phải tr ả về cùng kiểu vớ i thuộc tính đã đượ c khai báo. Bạn không nên khai báo tườ ng minh các tham số trong thủ tục  set , mà trình biên dịch sẽ tự động biết là có một tham số cùng kiểu tr ỏ đến giá tr ị. Cho một ví dụ, đoạn mã sau

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 21/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 21

chứa một thuộc tính gọi là  ForeName, nó sẽ cài một tr ườ ng  foreName cóchiều dài giớ i hạn:

 private string foreName; public string ForeName{get{

return foreName;}set{

if (value.Length>20)//code here to take error recovery action// (eg. Throw an exception)else

foreName = value;}

}

Khác vớ i VB các thủ tục get và set  đượ c định ngh ĩ a như là những hàmriêng biệt, trong C# chúng đượ c khai báo cùng nhau trong một khai báo thuộc

tính đơ n.Trong VB bạn khai báo tườ ng minh tham số cho thủ tục set và có thể chọn tên của nó, nhưng ngượ c lại trong C# tham số này hoàn toàn giả lậ p vàluôn mang tên là value. 

Thuộc tính chỉ  đọc và chỉ viế t:

Bạn có thể tạo ra thuộc tính chỉ đọc bằng cách bỏ thủ tục set trong khai báo và tạo ra thuộc tính chỉ ghi bằng cách bỏ thủ tục get trong khai bao thuộctính đó. Ví dụ để định ngh ĩ a thuộc tính Forename là chỉ đọc:

 private string foreName;

 public string ForeName{get

{return foreName;

}

}

 Bổ t ừ truy cậ p:

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 22/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 22

C# không cho phép cài đặt những bổ từ khác nhau cho thủ tục  set và get . Nếu bạn muốn tạo ra một thuộc tính có public để đọc nhưng lại muốn hạn

chế protected trong gán thì đầu tiên bạn phải tạo thuộc tính chỉ đọc vớ i bổ từ  public sau đó tạo một hàm set() vớ i bổ từ protected ở bên ngoài thuộc tính đó.

 public string ForeName{

get{

return foreName;}

}

 protected void SetForeName( string value){if (value.Length >20)

//code here to take error recovery action//(eg. Throw an exception)

elseforeName =value;

}

Thuộc tính Virtual và Abstract:

C# cho phép bạn tạo một thuộc tính virtual hay abstract. Để khai báomột thuộc tính virtual, overriden hay abstract bạn chỉ cần thêm từ khoá đótrong lúc định ngh ĩ a thuộc tính. Ví dụ để tạo một thuộc tính abstract thì cú

 pháp như sau:

 public abstract string ForeName

 get;

 set;

 }

Ví dụ sử dụng Property:

using System;using System.Collections.Generic;using System.Text;

namespace vd3.2.2{

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 23/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 23

   public class Time{

// public accessor methods public void DisplayCurrentTime(){

Console.WriteLine("Time\t: {0}/{1}/{2} {3}:{4}:{5}",month, date, year, hour, minute, second);

Console.ReadLine();}// constructors

 public Time(System.DateTime dt){

year = dt.Year;month = dt.Month;date = dt.Day;hour = dt.Hour;minute = dt.Minute;second = dt.Second;

}// tạo một đặc tính

 public int Hour 

{ get { return hour; }set { hour = value; }

}// các biến thành viên kiểu private

 private int year; private int month; private int date; private int hour; private int minute; private int second;

} public class Tester {

static void Main(){

DateTime currentTime = System.DateTime.Now;Time t = new Time(currentTime);t.DisplayCurrentTime();

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 24/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 24

  int theHour = t.Hour;Console.WriteLine("\nRetrieved the hour: {0}\n",

theHour);Console.ReadLine();theHour++;t.Hour = theHour;Console.WriteLine("Updated the hour: {0}\n",

theHour);Console.ReadLine();

}}

}3.2.3 Phươ ng thứ c

Mỗi lớ   p có thuộc tính và hành vi. Hành vi đượ c định ngh ĩ a là phươ ngthức thành viên của lớ  p.

Một phươ ng thức là một hàm sở  hữu bở i lớ   p mà chúng ta định ngh ĩ a.Thỉnh thoảng ngườ i ta gọi phươ ng thức thành viên là hàm thành viên. Hàmthành viên định ngh ĩ a những gì lớ  p của chúng ta có thể làm và hành vi của nónhư thế nào? Thông thườ ng một phươ ng thức là một tên của hành động.ví dụ WriteLine. Tuy nhiên chúng cũng có thể là các tên đặc biệt như Main().

  Khai báo phươ ng thức là một liên lạc giữa ngườ i tạo và sử dụng phươ ng thức.

  Để khai báo một phươ ng thức chúng ta cần chỉ ra kiểu giá tr ị về theo sau bở i tên. Một phươ ng thức có thể có tham số hay không.

[thành phần khai báo]<giá tr ị tr ả về ><tên phươ ng thứ c>(tham số  )

{  //than phuong thuc

 }

Thành phần khai báo là các từ khóa: public,static,abstract,private…

Giá tr ị tr ả về là kiểu dữ liệu mà ta có thể cho phươ ng thức đó tr ả về. Nếu phươ ng thức khônng có kiểu tr ả về ta sử dung từ khóa void.

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 25/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 25

Các thành phần khai báo public đượ c sử dụng bên trong và bên ngoài của lớ  p

+ Các thuộc tính thườ ng đượ c khai báo là private đã đượ c bảo vệ an toàndữ liệu

+ Các phươ ng thức thườ ng đượ c khai báo public để chúng có thể gọi đếncác hàm trong chươ ng trình

+ Còn hàm thành phần  protected  cũng giống hàm private chỉ khác là protected có thể truy nhậ p đượ c từ định ngh ĩ a các hàm dẫn xuất

+ abstract:- abstract có thể dùng để định ngh ĩ a Method : bắt buộc phảioverride ở  subclass. Method này chỉ  định ngh ĩ a mà không viết đầy đủ thân.Nếu trong class có một phươ ng thức abstract thì class đó buộc phải làabstract

+ static: Method và Variable : đượ c truy xuất tr ực tiệ p thông qua tên classmà không cần khở i dựng đối tượ ng.

+  final: Method : không cho phép override ở subclass 

Còn thân của phươ ng thức có thể đượ c thực hiện luôn trong khai báo lớ  phoặc ở bên ngoài. Khi xây dựng phươ ng thức, chúng ta cần chú ý là phươ ngthức có thể sử dụng các thành phần khác của lớ  p. 

Ví dụ sau là một hàm vớ i một tham số kiểu nguyên và phươ ng thức tr ả về một giá tr ị kiểu nguyên.

 public void nhap()

{

Console.WriteLine("Moi ban nhap vao mot so thuc");

n = float.Parse(Console.ReadLine());

}

 public float getN()

{

return n;

}

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 26/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 26

 Nếu hàm không tr ả về giá tr ị nó sẽ tr ả về kiểu void

 public void nhap()

{

Console.WriteLine("Moi ban nhap vao mot so thuc");

n = float.Parse(Console.ReadLine());

}

//void HienThi();

chươ ng trình :

using System;

using System.Collections.Generic;

using System.Text;

namespace DinhNghia

{class Program

{

//phuong thuc khong tri tra ve, co tham so truyen vao

static void Main(string[] args)

{

float[] arr;

float tong=0;Input input1 = new Input();

Console.WriteLine("---Tinh tong cua mot day so -----");

Console.Write("Nhap vao so phan tu trong day ");

int n = int.Parse(Console.ReadLine());

arr = new float[n];

for (int i = 0; i < n; i++)

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 27/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 27

{

//Input

input1.nhap();

arr[i] = input1.getN();

}

Console.WriteLine("----Tong cua day so----");

for (int i=0;i<n;i++)

{

tong+=arr[i];

}

Console.WriteLine("tong la {0}",tong);

Console.ReadLine();

}

}

class Input

{

float n;

//float tong;

//phuong thuc khong gia tri tra ve, khong tham so truyen vao

 public void nhap()

{

Console.WriteLine("Moi ban nhap vao mot so thuc");

n = float.Parse(Console.ReadLine());}

//phuong thuc co tri tra ve, khong thamn so truyen vao

 public float getN()

{

return n;

}

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 28/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 28

}

}

vidu1: DinhNghia

3.2.3.1 Phươ ng thứ c static

a. Thành phần t ĩ nh

- Dữ liệu và phươ ng thức thông thườ ng trong lớ  p đượ c tạo ra cho

mỗi đối tượ ng trong lớ  p. Do đó, vớ i mỗi thành phần, chúng ta có thể hìnhdung chúng là một bản sao cho mỗi đối tượ ng đượ c tạo ra.

- Lậ p trình hướ ng đối tượ ng cho phép gắn một thành phần dữ liệuhoặc một phươ ng thức cho cả một lớ  p. Chỉ có một bản sao như một thựcthể và các đối tượ ng dùng nó như nhau. Tức là tất cả các đối tượ ng cùngnhau chia sẻ thành phần t ĩ nh. Thành phần t ĩ nh tồn tại ngay khi không mộtđối tượ ng nào đượ c tạo ra. Trong C# chúng ta tạo ra những thành phần này

 bằng cách sử dụng từ khóa static

 b. Phươ ng thức t ĩ nh.

- Đặc điểm:

- Các phươ ng thức t ĩ nh thuộc về lớ  p chứ không thuộc về bất cứ đối tượ ng nào.

- Gọi hàm thành phần t ĩ nh thông qua Lớ  p.Phươ ng_Thức_T ĩ nh.

- Hàm thành phần t ĩ nh chỉ có quyền truy nhậ p, xử lý dữ liệu của

lớ  p (các dữ liệu thành phần t ĩ nh) mà không có quyền truy nhậ p và sử dụngcác dữ liệu thành phần thông thườ ng. Phươ ng thức t ĩ nh không sử dụngđượ c con tr ỏ this.

- Hàm thành phần t ĩ nh chịu ảnh hưở ng của các quy định về đónggói dữ liệu: private, public, protected.

Khi muốn tạo ra thành phần phươ nt thức t ĩ nh trong C# thì ta cần thêmtừ khóa static tr ướ c kiểu tr ả về của phươ ng thức.

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 29/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 29

ví dụ:

class Program

{

static float so=3;

static float so1;

float so2;

static void nhap1()

{

Console.WriteLine("chi dung de nhap cac thanh phan static");

Console.WriteLine("hien thi so {0}",so);

Console.WriteLine("Nhap vao mot so");

so1 = float.Parse(Console.ReadLine());

//khong the nhap so2 o day vi khong phai la static

}

//de nhap so 2 thi phuong thuc nhap khong dc khai bao static

void nhap()

{

//co the nhap ca so 1 va so 2

Console.WriteLine("nhap so1 ");

so1 = float.Parse(Console.ReadLine());

Console.WriteLine("nhap so2");

so2 = float.Parse(Console.ReadLine());

}

static void Main(string[] args)

{

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 30/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 30

  //khong can tao doi tuong pro1

nhap1();

//de truy cap toi nhap() can tao doi tuong pro1

Program pro1 = new Program();

Console.WriteLine("Nhap vao mot so");

//pro1.nhap1();--- khong the truy cap vi khong tao ra mot dooituong 

Console.WriteLine("Nhap dc ca 2 so");

 pro1.nhap();

Console.ReadLine();

}

vidu

3.2.3.2 Phươ ng thứ c ảo và đa hình

 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 virtualhay 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áotrong 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ừahưở 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 đó. Gọi các phiên bản cơ  sở  của các chứcnăng(base Versions of Functions):

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 31/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 31

- Trong C# có một cú pháp đặc biệt để gọi những phiên bản cơ sở củamột phươ ng thức từ một lớ  p thừa hưở ng. Cú pháp : base.<methodname>(). 

Phươ ng thứ c trong lớ p cha: C# hỗ tr ợ từ khóa "base" cho việc gọi lại các phươ ng thức của lớ   p cha. Hàm nạ  p chồng (overload) đượ c khai báo 1 cáchtườ ng minh bằng từ khóa "override"

-  Phươ ng thức ảo là cách thu đượ c từ tính đa hình.

-  xét Phươ ng thức ảo

using System;

using System.Collections.Generic;using System.Text;

namespace vidu3

{

class Program

{

static void Main(string[] args){

DongVat dongVat1 = new DongVat("ga", 2, "can");

ConMeo conmeo1 = new ConMeo("meo", 4, "can");

CayXanh cayTao = new CayXanh("tao", 0, "can", "qua tao");

Console.WriteLine("ket qua cua lop dong vat");

dongVat1.HienThi();

Console.WriteLine("ket qua cua lop con meo ");conmeo1.HienThi();

Console.WriteLine("Ket qua cua lop cay xanh");

cayTao.HienThi();

Console.ReadLine();

}

}

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 32/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 32

   public class DongVat

{

 protected string ten;

 protected int chan;

 protected string moitruong;

 public DongVat(string ten, int chan, string moitruong)

{

this.ten = ten;

this.chan = chan;

this.moitruong = moitruong;

}

//phuong thuc duoc khai bao la ao

 public virtual void HienThi()

{

Console.WriteLine("con {0} co {1} chan ,song o moi truong {2}", ten,chan, moitruong);

}

}

 public class ConMeo : DongVat

{

 public ConMeo(string ten, int chan, string moitruong)

: base(ten, chan, moitruong)

{

}

//phu quyet phuong thuc HienThi cua lop co so

 public override void HienThi()

{

 base.HienThi();

Console.WriteLine("con vat ma toi yeu thich la con {0} co {1}chan,thich an {2}", ten, chan, moitruong);

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 33/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 33

}

}

 public class CayXanh : DongVat

{

//bien cua class cayxanh

 private string qua;

 public CayXanh(string ten, int chan, string moitruong, string thayDoi)

: base(ten, chan, moitruong)

{

qua = thayDoi;

}

//thuc hien phu quyet phuong thuc hienthi()

 public override void HienThi()

{

 base.HienThi();

Console.WriteLine("co su thay doi o day la : {0}", qua);

}

}

}

tạiđây

Ban đầu ta xây dựng phươ ng thức đượ c khai báo là ảo:

 public virtual void HienThi()

{

Console.WriteLine("con {0} co {1} chan ,song o moitruong {2}",ten,chan,moitruong);

}

thực hiện phủ quyết phươ ng thức HienThi() trong 2 class sau:

-  Phươ ng thức không có tham số 

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 34/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 34

//phu quyet phuong thuc HienThi cua lop co so

 public override void HienThi()

{

 base.HienThi();

Console.WriteLine("con vat ma toi yeu thich la con {0} co {1}chan,thich an {2}",ten,chan,moitruong);

}

Phươ ng thức có tham số truyền vào hàm khở i dựng

//thuc hien phu quyet phuong thuc hienthi()

 public override void HienThi()

{

 base.HienThi();

Console.WriteLine("co su thay doi o day la : {0}",qua);

}

3.2.3.3 Phươ ng thứ c trừ u tượ ng

- abstract có thể dùng để định ngh ĩ a Method : bắt buộc phải override ở  subclass. Method này chỉ định ngh ĩ a mà không viết đầy đủ thân.

-  Nếu trong class có một phươ ng thức abstract thì class đó buộc phải làabstract C# cho phép cả lớ  p và phươ ng thức có thể khai báo abstract. Một lớ  pabstract không đượ c thể hiện và một phươ ng thức abstract không đượ c thựcthi mà phải đượ c overriden trong bất k ỳ lớ  p thừa hưở ng không abstract nào.

Một phươ ng thức abstract sẽ tự động đượ c khai báo virtual. Nếu một lớ  p có phươ ng thức abstract thì nó cũng là lớ  p abstract và đượ c khai báo như sau:

-  Ví dụ:

abstract class C{

abstract void method();

…}

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 35/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 35

 public abstract class DongVat

{

 protected string ten;

 protected int chan;

 protected string moitruong;

 public DongVat(string ten, int chan, string moitruong)

{

this.ten = ten;

this.chan = chan;

this.moitruong = moitruong;

}

//phuong thuc duoc khai bao la ao

 public abstract void HienThi();

//{

// Console.WriteLine("con {0} co {1} chan ,song o moi truong{2}", ten, chan, moitruong);

//}

}

vidu4

Xét phươ ng thức ảo : nhưng sử dụng vớ i từ khóa abstract

3.2.3.4 Phươ ng thứ c ToString()

- Đây là phươ ng thức của đối tượ ng object (và chứa tất cả các đối tượ ngkhác) thườ ng dùng để chuyển đổi một đối tượ ng bất k ỳ sang kiểu chuỗi.

ví dụ:

int myInterger=5;

string intString=myInterger.ToString(); 

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 36/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 36

Chuỗi intString có gí tr ị là “5” bằng cách này ta cũng có thể tạo ra mộtchuỗi mớ i. Chuỗi cũng có thể  đượ c tạo thông qua hàm dựng của lớ  p

System.String. Lớ  p này có hàm dựng nhận vào một mảng các ký tự. Như vậyta cũng tạo đượ c chuỗi từ mảng ký tự.

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

a. Constructors

Constructors là những hàm đặc biệt cho phép thực thi, điều khiển chươ ngtrình ngay khi khở i tạo đôi tượ ng. Trong C#, Constructors có tên giống như tên của Class và không tr ả lại giá tr ị.

Ví dụ:

class Library 

{

 private int ibooktypes;

//Constructor  

 public Library()

{

ibooktypes = 7;

}

 public Library(int value)

{

ibooktypes = value;

}

}

b. Destructors

Là một hàm đặc biệt đượ c sử dụng để làm sạch bộ nhớ . Cách khai báogiống như Constructor nhưng không có tham số và đượ c bắt đầu bằng dấu“~”.

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 37/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 37

Ví dụ 

class Library 

{

 private int ibooktypes;

//Constructor  

 public Library()

{

ibooktypes = 7;

}

 public Library(int value)

{

ibooktypes = value;

}

~ Library()

{

//thực thi câu lệnh 

}

}

3.2.4 Nạp chồng phươ ng thứ c

Là việc xây dựng nhiều các phươ ng thức cùng tên nhưng nhận các tham

số khác nhau.Một ký hiệu (signature) của một phươ ng thức đượ c định ngh ĩ a như tên

của phươ ng thức cùng vớ i danh sách tham số của phươ ng thức. Hai phươ ngthức khác nhau khi ký hiệu của chúng khác là khác nhau tức là khác nhau khitên phươ ng thức khác nhau hay danh sách tham số khác nhau. Danh sách thamsố đượ c xem là khác nhau bở i số lượ ng các tham số hoặc là kiểu dữ liệu củatham số. Ví dụ đoạn mã sau, phươ ng thức thứ nhất khác phươ ng thức thứ haido số lượ ng tham số khác nhau. Phươ ng thức thứ hai khác phươ ng thức thứ bado kiểu dữ liệu tham số khác nhau:

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 38/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 38

void myMethod( int p1 );void myMethod( int p1, int p2 );

void myMethod( int p1, string p2 );Một lớ  p có thể có bất cứ số lượ ng phươ ng thức nào, nhưng mỗi phươ ng

thức trong lớ  p phải có ký hiệu khác vớ i tất cả các phươ ng thức thành viên cònlại của lớ  p.

Ví dụ 1: minh họa lớ  p Time có hai phươ ng thức khở i dựng, một phươ ngthức nhận tham số là một đối tượ ng DateTime còn phươ ng thức thứ hai thìnhận sáu tham số nguyên.

Ví d ụ 1: Minh họa nạ p chồng phươ ng thứ c khở i d ự ng.

-----------------------------------------------------------------------------using System;

 public class Time{

 public void DisplayCurrentTime(){Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,Date, Month, Year, Hour, Minute, Second);}

 public Time( System.DateTime dt){Year = dt.Year;Month = dt.Month;Date = dt.Day;Hour = dt.Hour;Minute = dt.Minute;Second = dt.Second;}

 public Time(int Year, int Month, int Date, int Hour, int Minute, int Second){this.Year = Year;this.Month = Month;this.Date = Date;this.Hour = Hour;this.Minute = Minute;this.Second = Second;}

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 39/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 39

// Biến thành viên private private int Year;

 private int Month; private int Date; private int Hour; private int Minute; private int Second;}

 public class Tester {static void Main(){

System.DateTime currentTime = System.DateTime.Now;Time t1 = new Time( currentTime);t1.DisplayCurrentTime();Time t2 = new Time(2002,6,8,18,15,20);t2.DisplayCurrentTime();}}

-----------------------------------------------------------------------------  K ế t quả:

2/1/2002 17:50:17

8/6/2002 18:15:20

-----------------------------------------------------------------------------

 Như chúng ta thấy, lớ   p Time trong ví dụ 1 có hai phươ ng thức khở idựng. Nếu hai phươ ng thức có cùng ký hiệu thì trình biên dịch sẽ không thể 

 biết đượ c gọi phươ ng thức nào khi khở i tạo hai đối tượ ng là t1 và t2. Tuy

nhiên, ký hiệu của hai phươ ng thức này khác nhau vì tham số truyền vào khácnhau, do đó trình biên dịch sẽ xác định đượ c phươ ng thức nào đượ c gọi dựavào các tham số.

Khi thực hiện nạ p chồng một phươ ng thức, bắt buộc chúng ta phải thayđổi ký hiệu của phươ ng thức, số tham số, hay kiểu dữ liệu của tham số. Chúngta cũng có thể toàn quyền thay đổi giá tr ị tr ả về, nhưng đây là tùy chọn. Nếuchỉ thay đổi giá tr ị tr ả về thì không phải nạ p chồng phươ ng thức mà khi đó hai

 phươ ng thức khác nhau, và nếu tạo ra hai phươ ng thức cùng ký hiệu nhưngkhác nhau kiểu giá tr ị tr ả về sẽ tạo ra một lỗi biên dịch.

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 40/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 40

Ví d ụ 2: N ạ p chồng phươ ng thứ c.

-----------------------------------------------------------------------------

using System; public class Tester {

 private int Triple( int val){return 3*val;}

 private long Triple(long val){

return 3*val;}

 public void Test(){int x = 5;int y = Triple(x);Console.WriteLine(“x: {0} y: {1}”, x, y);long lx = 10;long ly = Triple(lx);

Console.WriteLine(“lx: {0} ly:{1}”, lx, ly);}static void Main(){Tester t = new Tester ();t.Test();}

} -----------------------------------------------------------------------------

  K ế t quả:

x: 5 y: 15

lx: 10 ly:30

-----------------------------------------------------------------------------

Trong ví dụ này, lớ   p Tester nạ  p chồng hai phươ ng thức Triple(), một phươ ng thức nhận tham số nguyên int, phươ ng thức còn lại nhận tham số là số 

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 41/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 41

nguyên long. Kiểu giá tr ị tr ả về của hai phươ ng thức khác nhau, mặc dù điềunày không đòi hỏi nhưng r ất thích hợ  p trong tr ườ ng hợ  p này.

3.2.5 K ế thừ a3.2.5.1 Sự k ế thừ a

C# hỗ tr ợ  đơ n thừa k ế giữa các lớ  p. Một lớ  p có thể thừa hưở ng nhữngthuộc tính và phươ ng thức từ một lớ  p khác. Cú pháp:

class MyDerivedClass : MyBaseClass{

// functions and data members here}

Trong C# một lớ  p bắt buột phải thừa k ế từ một lớ  p nào đó. C# hỗ tr ợ  một lớ  p cơ sở toàn diện gọi là System.Object. Trong ngôn ngữ C# để tạo mộtlớ  p dẫn xuất từ một lớ   p ta thêm dấu hai chấm vào sau tên lớ  p dẫn xuất vàtr ướ c tên lớ  p cơ sở :

 public class ListBox : Window

Đoạn lệnh trên khai báo một lớ  p mớ i tên là ListBox, lớ  p này đượ c dẫnxuất từ Window.

Lớ  p dẫn xuất sẽ k ế thừa tất cả các thành viên của lớ  p cơ sở , bao gồm tấtcả các phươ ng thức và biến thành viên của lớ  p cơ sở . Lớ  p dẫn xuất đượ c tự dothực thi các phiên bản của một phươ ng thức của lớ  p cơ sở . Lớ  p dẫn xuất cũngcó thể tạo một phươ ng thức mớ i bằng việc đánh dấu vớ i từ khóa new. Ví dụ 3sau minh họa việc tạo và sử dụng các lớ  p cơ sở và dẫn xuất.

Ví d ụ 3: S ử d ụng l ớ  p d ẫ n xuấ t.

-----------------------------------------------------------------------------

using System; public class Window{

// Hàm khở i dựng lấy hai số nguyên chỉ // đến vị trí của cửa sổ trên console

 public Window( int top, int left){this.top = top;this.left = left;}// mô phỏng vẽ cửa sổ 

 public void DrawWindow()

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 42/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 42

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

}// Có hai biến thành viên private do đó// hai biến này sẽ không thấy bên trong lớ  p// dẫn xuất.

 private int top; private int left;}// ListBox dẫn xuất từ Window

 public class ListBox: Window{

// Khở i dựng có tham số  public ListBox(int top, int left,string theContents) : base(top, left) // gọi khở i dựng của lớ  p cơ sở  {mListBoxContents = theContents;}// Tạo một phiên bản mớ i cho phươ ng thức DrawWindow// vì trong lớ  p dẫn xuất muốn thay đổi hành vi thực hiện// bên trong phươ ng thức này

 public new void DrawWindow(){ base.DrawWindow();Console.WriteLine(“ ListBox write: {0}”, mListBoxContents);}// biến thành viên private

 private string mListBoxContents;}

 public class Tester {

 public static void Main(){// tạo đối tượ ng cho lớ  p cơ sở  Window w = new Window(5, 10);w.DrawWindow();// tạo đối tượ ng cho lớ  p dẫn xuấtListBox lb = new ListBox( 20, 10, “Hello world!”);lb.DrawWindow();}

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 43/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 43

}

-----------------------------------------------------------------------------

  K ế t quả:

Drawing Window at: 5, 10

Drawing Window at: 20, 10

ListBox write: Hello world!

-----------------------------------------------------------------------------

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

Trong ví dụ 3, phươ ng thức DrawWindow() của lớ  p ListBox sẽ làm ẩnvà thay thế phươ ng thức DrawWindow của lớ  p cơ sở Window. Khi chúng tagọi phươ ng thức DrawWindow của một đối tượ ng của lớ  p ListBox thì phươ ngthức ListBox.DrawWindow() sẽ  đượ c thực hiện, không phải phươ ng thứcWindow.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.

G ố c của t ấ t cả các l ớ  p: Lớ  p 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àycũ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êncù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. Trongngô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ấ pcá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ẫnxuấ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ứcGetType() tr ả về kiểu của đối tượ ng. Và phươ ng thức ToString () tr ả về mộtchuỗi thể hiện lớ  p hiện hành.

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

Equal( ): So sánh bằng nhau giữa hai đối tượ ng.

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 44/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 44

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;

 public class SomeClass{

 public SomeClass( int val ){value = val;}// phủ quyết phươ ng thức ToString của lớ  p Object

 public virtual string ToString(){return value.ToString();}// biến thành viên private lưu giá tr ị 

 private int value;}

 public class Tester {static void 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());}} 

-----------------------------------------------------------------------------

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 45/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 45

K ết quả:

The value of i is: 5

The value of s is 7

The value of 5 is 5

-----------------------------------------------------------------------------

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

 public virtual 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ẫnxuất từ lớ   p Object nên nó cũng có thể thực thi các phươ ng thức của lớ  pObject.

Lớ  p SomeClass trong ví dụ trên thực hiện việc phủ quyết phươ ng thứcToString(), do đó phươ ng thức này sẽ tr ả về giá tr ị có ngh ĩ a. Nếu chúng takhông phủ quyết phươ ng thức ToString() trong lớ  p SomeClass, phươ ng thứccủ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êncủ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ẫnxuấ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éphàm đó đượ c overriden trong bất k ỳ một lớ  p thừa hưở ng nào.

class MyBaseClass{

 public virtual string VirtualMethod(){

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

}

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 46/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 46

Như ví dụ trên, tức là ta có thể tạo ra một sự thực thi khác củaVirtualMethod() 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ớ  pthừ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àmmuốn override một hàm khác thì phải sử dụng từ khoá override:

class MyDerivedClass : MyBaseClass{

 public override string 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ả haikhai 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ôngkhai 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ứchơ n là hide nó. Bở i vì hide dễ gây ra những lỗi nghiêm tr ọng. Nhưng cú phápC# đượ c thiết k ế để bảo đảm cho những nhà phát triển sẽ đượ c cảnh báo trongthờ i gian biên dịch về vấn đề nghiêm tr ọng này. Nếu bạn tạo ra hai phươ ngthứ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;

 public class Window{

 public Window( int top, int left ){this.top = top;this.left = left;}

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 47/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 47

// phươ ng thức đượ c khai báo ảo public virtual void DrawWindow()

{Console.WriteLine( “Window: drawing window at {0}, {1}”, top, left );}// biến thành viên của lớ  p

 protected int top; protected int left;}

 public class 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

 public override void 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ở  

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

 public class Tester {static void 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();Window[] winArray = new Window[3];

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 48/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 48

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

................... ................................................................................

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 49/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 49

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ầnlàm nên một chươ ng trình hướ ng đối tượ ng - và lậ  p trình hướ ng đối tượ ngtrong C#. Trong chươ ng này chúng ta đã thảo luận về nội dung cơ bản của lậ ptrì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áctr ườ ng, thuộc tính, phươ ng thức và sự kiện trong C# nói riêng. Ngoài ra nộidung 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#.

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ựchiệ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ếuxó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.

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 50/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 50

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ọcKHTN-Đ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.

http://dot.net.vn/Desktop.aspx/dotNET-Libraries/dotNET-eBooks/  

5/10/2018 TV_LTHDT_C# - slidepdf.com

http://slidepdf.com/reader/full/tvlthdtc 51/51

 

  w  w

  w .  c   h   i

  a  s  e   t   h

  o  n  g    t   i  n .  o

  r  g 

http://www.ebook.edu.vn 51

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

3.1.1 GIỚI THIỆU VỀ LẬP TRÌNH HƯỚ NG ĐỐI TƯỢ NG.............................................2

3.1.2 CÁC TÍNH CHẤT CỦA LẬP TRÌNH HƯỚ NG ĐỐI TƯỢ NG ................................73.1.3 CÁC KHÁI  NIỆM TRONG LẬP TRÌNH HƯỚ NG ĐỐI TƯỢ NG ...........................83.1.3.1 Đố i t ượ ng ............................................................................................................83.1.3.2 Lớ  p đố i t ượ ng...................................................................................................... 9 

3.1.3.3 Tr ừ u t ượ ng hóa d ữ liệu (Abstraction)...............................................................103.1.3.4 Bao gói và che giấ u thông tin (Encapsulation and Information Hiding) .........113.1.3.5 S ự mở r ộng, k ế thừ a giữ a các l ớ  p (Inheritance)...............................................113.1.3.6  Đa xạ (t ươ ng ứ ng bội) và nạ p chồng (Polymorphism and Overloading).........123.1.3.7 Liên k ế t động (Dynamic binding) .....................................................................133.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.1 LỚP..........................................................................................................................153.2.1.1 Định nghĩ a l ớ  p ..................................................................................................153.2.1.2 Đố i t ượ ng ..........................................................................................................17

3.2.2 THUỘC TÍNH(PROPERTIES):...................................................................................193.2.3 PHƯƠ NG THỨ C.....................................................................................................24

3.2.3.1 Phươ ng thứ c static............................................................................................283.2.3.2 Phươ ng thứ c ảo và đ a hình...............................................................................303.2.3.3 Phươ ng thứ c tr ừ u t ượ ng ...................................................................................343.2.3.4 Phươ ng thứ c ToString()....................................................................................353.2.3.5 Hàm t ạo (Constructors) và hàm hủ y (Destructors) trong C#...........................36

3.2.4  NẠP CHỒ NG PHƯƠ NG THỨ C.............................................................................373.2.5 K Ế THỪ A ................................................................................................................41

3.2.5.1 S ự k ế thừ a .........................................................................................................413.2.5.2. Gọi phươ ng thứ c của l ớ  p cơ sở .......................................................................43