Lời mở đầu

Trong chương trình đã học trước đây chúng ta đã được làm quen với mộ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ướng cấu trúc. Đối với các chương trình nhỏ thì phương pháp này tương đối hiệu 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à 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ém hiệu quả. Và phương pháp lập trình hướng đối tượng ra đời nhằm khắc phục nhữ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ôn ngữ lập trình mạnh hiện nay là C#, bộ đôi có khả năng giải quyết những bài toán từ đơn giản đến phức tạp nhất.

w

w

w

.c

hi

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.

as

et

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

ho

-

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

ng

Trong chương này, bạn sẽ được giới thiệu 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 gồm 2 phần sau:

tin

.o

rg

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ệm lậ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úng ta 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ương trì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ẫn thườ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ột mứ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ục tiê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ựng chương trình. Thực chất đây không phải là một phương pháp mới mà là một cá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ình theo 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ập trì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ết vấ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ình con). 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ập trì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úng lại với nhau cho chúng ta một hệ thống chương trình để giải quyết vấn đề đặt ra. 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, được hiể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ông việ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).
http://www.ebook.edu.vn

w

w

w

.c

hi

as

et
2

ho

ng

tin

.o

rg

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ết củ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ình xây dựng hiện đại, như sân vận động có mái che hình vòng cung, những kiến trúc thẩm mĩ với đường nét hình cong. Tất cả những sản phẩm đó xuất hiện cù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ững viên gạch, những tảng đá để tạo nên những quần thể kiến trúc (như Tháp Chàm Nha Trang, Kim Tự Tháp,...), mà có thể với bêtông, sắt thép và không nhiề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ết dí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ểu theo 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 được vớ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òn chiế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 suy nghĩ như vậy với các khái niệm trừu tượng được sử dụng trong các chương trì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ậy khô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ược lại hai mẫu tin nhân sự lại không thể cộng với nhau được. Một chương trình hướ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ường tự 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ới vớ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ên cá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ức xâ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.

http://www.ebook.edu.vn

w

w

w

.c

hi

as

et
3

ho

ng

tin

.o

rg

Đây là phương pháp hiệu quả để tổ chức thế giới quanh chúng ta. Các chương trì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ác cơ 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 trong chương trình theo một cách tương tự như các nhà sinh học tổ chức các loại thự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ác thao 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ệu của lớp còn gọi là các biến thực thể (Instance variable). Các phương thức định nghĩ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ệc theo thông điệp đó. Các đối tượng đều độc lập với nhau vì vậy các thay đổi trê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ày khô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 “đối tượ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ùng chứ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ác như 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ệu luô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ảo sát. Các thao tác trong đối tượng được gọi là các phương thức hay hành vi của đối tượng đó. Phương thức và dữ liệu của đối tượng luôn tác động lẫn
http://www.ebook.edu.vn 4

w

w

w

.c

hi

as

et

ho

ng

tin

.o

rg

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ười lậ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ăm gần đây, thay thế cho "structured", công nghệ lập trình hướng thủ tục là công nghệ 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ổng hợ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, Gateway và 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úng vớ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ại sự 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ức mạnh của hàng cung cấp, ổ đĩa, motherboard và các thiết bị khác. Điều này tạo cho 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 nhanh chó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 đóng gói". Ví dụ, khi họ mua một bộ nguồn, họ đang mua một cái j đấy với các thuộ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ần trong 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
http://www.ebook.edu.vn 5

w

w

w

.c

hi

as

et

ho

ng

tin

.o

rg

j. cũng không nên lộ dữ liệu cho object khác xử lý trực tiếp. Chú ý rằng tribg tuêy đề của Wirth. OOP giữ việc sắ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ên dữ liệu. Object đầu tiên đề nghị object thứ hai mang nhiệm vụ ra ngoài. 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. giải thuật đi trước và cấu trúc dữ liệu đến sau. những nhà sản xuất máy tính không quan tâm bên trong về nguồn cung cấp lâu như những j họ muốn. bước tiếp theo là tìm cách kết hợp để lưu giữ data. Cả việc thiết kế và debug đều trở 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ụ. giảm sự phụ thuộc dữ liệu. Tất cả mọi việc giao tiếp nên thông qua method. Tất nhiên.edu.c hi as et 6 ho ng tin . Vì thế. Bằng cách đóng gói dữ liệu object. thời gian debug rút ngắn lại. bạn giảm được tối đa. giống như module trong ngôn ngữ hướng thủ tục. 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 đề. Trước tiên. bạn sẽ không muốn một object cá nhân làm quá nhiều. 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. http://www. Điều này là điều giải thích nhà thiết kế ngôn ngữ Pascal. 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. (Ngược với Pascal). 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ách này giống như các nhà lập trình làm việc ở thời gian đó. 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. 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àng trăm các thủ tục thao tác dữ liệu.ebook.o rg . nó cần access đến một object khác chịu trách nhiệm đó. bạn quyết định cách thao tác với dữ liệu. Niklaus Wirth. 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ó. 1975). Sau khi các thủ tục được xác định.vn w w Tóm lại. Về cá nhân. 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 w . gọi quyển sách nổi tiếng về lập trình của ông Giải thuật và Cấu trúc dữ liệu = Lập trình (Prentice Hall. các thủ tục này thường được gọi là method calls).

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.c 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ếp làm việc lên.o rg . Nếu không có gì lầm lẫ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.ebook. thay đổi trạng thái của nó và liên lạc với các đối tượng khá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 thao tác. Chỉ có các phương thức nội tại của đối tượng cho phép thay đổi trạng thái của nó.3. http://www. Đây là tính chất đảm bảo sự toàn vẹn của đối tượng. các đối tượng thường được trừu tượng hóa qua việc định nghĩa của các lớp (class). Việc cho phép môi trường bên ngoà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àn toàn tùy thuộc vào người viết mã. 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ả đối tượng có những tính chất gì. w w . 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. nghĩa là nó có khả năng tập trung vào những cốt lõi cần thiết. báo cáo.edu. Mỗi phương thứ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ười lập trình) được xem là một đặc tính riêng của đối tượng. Đơn vị này tương đương với một chương trình con 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). 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 đổi trạng thái nội tại của một đối tượng. 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ợp các dữ liệu nội tại tạo thành thuộc tính của đối tượng). hi as et ho Lập trình hướng đối tượng là một phương pháp lập trình có các tính chất chính sau: ng tin .1. 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ừu tượng hay hay lớp cơ sở trừu tượng.vn 7 w 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.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. 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. Tính chất này thường được gọi là sự trừu tượng của dữ liệu. Trong thực 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ột cách nội bộ. Trong thực tế.

Các phương thức dùng trả lời cho một thô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. w Các thao tác trên các dữ liệu để xác định hành vi của đối tượng đó. 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. Như vậy. Tuy nhiên. vật. et 3. không phải ngôn ngữ định hướng đối tượng nào cũng có tính chất này.3 Các khái niệm trong lập trình hướng đối tượng 3. hi Mỗi đối tượng có tập các đặc trưng bao gồm: as Đối tượng là thực thể của hệ thống. 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ý trong chương trình. .vn 8 w w Các mối quan hệ với các đối tượng của các lớp khác. của CSDL và được xác định thông qua định danh ID (IDentifier) của chúng. Như vậy. Người lập trình có thể định nghĩa một đặc tính (chẳng hạn thông qua tên của các phương thức) cho một loạt các đối tượng gần nhau như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 đối tượ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. Đối tượng là những thực thể được xác định trong thời gian hệ thống hướng đối tượng hoạt động. đối tượng có thể biểu diễn cho người. Điều này cho 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. http://www.1.3. 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 đối tượng khác. 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".ebook. 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.1 Đối tượng ho ng tin . 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".c) Tính đa hình (polymorphism): Thể hiện thông qua việc gửi các thông điệp (message). đối tượng được định nghĩa một cách trừu tượng như là một khái niệm.o rg .1.c 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ính mô tả các tính chất và các phương thức.edu. Mỗi đối tượng chỉ tồn tại trong thời gian nhất định trong hệ thống.

Phương pháp lập trình hướng đối tượng là cách phân chia chương trình thà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ệu lẫn hàm và chúng sẽ được sử dụng như các mẫu để tạo ra bản sao từng đối tượng khi chúng được tạo ra trong hệ thống.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.vn w w w + Riêng (private).c hi as et 9 Hình: Một đối tượng Con người và một đối tượng Xe máy ho Hành động: Đi Nói Suy nghĩ Hành động: Khởi động Ngừng Chuyển động ng tin Tên: Nam Tuổi: 28 Trọng lượng: 65 kgs Loại: Future Màu: Đỏ Năm: 1995 .o rg Con người Xe máy .ebook. . + Được bảo vệ (protected). http://www. Mỗi đối tượng chính là thể hiện (một cá thể. nghĩa là có các thuộc tính và hành vi giống nhau.edu.3.1. 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). đại diện) của một lớp xác định.3. 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ống nhau.

Tên: Kiểu chuỗi .3. Ngừ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 .o rg . chính nhất và bỏ qua những chi tiết vụn vặt.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. trong khi lớp là một mô hình khái niệm . Khi xây dựng phần mềm thì nguyên lý trừu tượng hoá được thực hiện thông qua việc trừu tượng hoá các chức năng.Trọng lượng: Kiểu sốố . phục vụ cho việc giải một lớp các bài toán nào đó.Năm: Kiểu sốố . Nói .c hi Một lớp là một nguyên mẫu của một đối tượng.Tuổi: Kiểu sốố .Loại: Kiểu chuỗi .1. Chuyển động Hình: Một Lớp Con người và một Lớp Xe máy Chú ý: Sự khác biệt thực sự giữa một lớp và một đối tượng: Đối tượng là một mô hình thực.ebook. Suy nghĩ Lớp Xe máy . 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.edu. http://www.Màu: Kiểu chuỗi . et 10 ho ng Một lớp định nghĩa một thực thể. 3. trong khi đó một đối tượng là một trường hợp của thực thể ấy. 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ể as 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. Khởi độ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. 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. tin . Đi .vn w w w .đị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.

Đó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.o rg . công khai hay được bảo vệ bao gồm cả dữ liệu và 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ủa những đối tượng khác. 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.3.ebook. 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ế.c 3.5 Sự mở rộng. Kỹ thuật này cho phép xác định các vùng đặc trưng riêng.3. Một lớp có thể là lớp con (lớp dẫn xuất) của một lớp khác. 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ền sử 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ác lớp khác.4 Bao gói và che giấu thông tin (Encapsulation and Information Hiding) 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. Dữ liệu riêng Hàm riêng .vn 11 w w w hi Dữ liệu công khai Hàm công khai as et ho ng tin . http://www. 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.1.3.1.edu.

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ở.3. hàm thành phần riêng là không được phép kế thừa.edu. Đa xạ là kỹ thuật được sử dụng để mô tả khả năng gửi một thông điệp chung 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. hàm thành phần được bảo vệ và công khai là được quyền kế thừa. công khai). công khai).Theo nguyên lý chung của kế thừa thì chỉ những thuộc tính. et 12 + Bổ sung thêm một số thuộc tính. ở những vùng được phép kế thừa (được bảo vệ. Có thể diễn đạt cơ chế kế thừa như sau: Bổ sung thêm một số thuộc tính.1. hàm đã được xác định trong B. hàm để mô tả được đúng các hành vi của những đối tượng mà lớp A quản lý. 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ộc tính. hàm để mô tả được đúng các hành vi của những đối tượng mà lớp A quản lý.vn w w w .6 Đa xạ (tương ứng bội) và nạp chồng (Polymorphism and Overloading).c hi as + Viết đè (thay đổi hành vi ứng xử) của các hàm được kế thừa.o rg . 3.ebook. ho ng tin . ở những vùng được phép kế thừa (được bảo vệ. hàm đã được xác định trong B. Lớp A kế thừa lớp B sẽ có (không tường minh) tất cả các thuộc tính. http://www. còn những thuộc tính.

// Cộng hai số phức w String Cong(String. tin // Cộng hai số nguyên // Cộng hai số thực // Ghép hai xâu // Ghép một xâu với một số .o rg .vn w w ng Đ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ụng chung một giao diện (cùng một tên gọi). float). Theo một nghĩa nào đó.Ví dụ: float Cong(float. 3.3. String). đa xạ là sự mở rộng khái niệm sử dụng lại trong nguyên lý kế thừa.ebook. hi int Cong(int. chức năng khi chương trình thực hiện các lời gọi các hàm.c nguyên. String Cong(String.1. chức năng đó theo ngữ cảnh hiện thời. .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 định ngay khi dịch chương trình. http://www. Complex). ho Complex Cong(Complex. int). cụ thể là tuỳ thuộc vào kiểu và số các tham số của chúng. int). as et 13 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ực hiện khác nhau tùy theo ngữ cảnh.edu. Liên kết động là dạng liên kết các hàm.

Trong liên kết động. 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 đó.c hi as Ví dụ. http://www. 3. Xác định sự trao đổi thông tin giữa các đối tượng trong hệ thống. 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ột việc.o rg Tạo ra các đối tượng theo định nghĩa của các lớp.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ối quan hệ giữa các đối tượng đó với nhau. nội dung của đoạn chương trình ứng với chức năng. ng tin . khi hệ thống máy tính muốn in một tệp dataFile thì máy tính hiện thời (:Computer) gửi đến cho đối tượng :PrinterServer một yêu cầu Print(dataFile).ebook.1. et 14 ho Trong chương trình.edu.3. 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. 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ể. Lập trình trong ngôn ngữ hướng đối tượ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. một yêu cầu (thỉnh cầu) nào đó.vn w w w . Nguyên lý trao đổi thông tin bằng cách truyền thông điệp cho phép chú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ế. 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ụ). .

các thuộc tính(properties).ebook.2. các phương thức(methods).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-defined type – UDT).NET 3.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ẽ được chứ ở vùng nhớ heap và được quản lí bởi bộ thu gom rác( GC).edu.c hi Giải thích Truy xuất mọi nơi Truy xuất trong nội bộ lớp hoặc trong các lớp con 15 as [attribute] [bổ từ truy xuất] class <tên của lớp> [:lớp cơ sở] et Định nghĩa một lớp mới với cú pháp như sau: ho Lớp ảo (abstract class) không thể tạo trực tiếp nhưng cung cấp các thuộc tính để lớp kết thừa định nghĩa. Lớp có thể được thừa kế từ những lớp khác và phát triển đa giao diện (multiple interfaces).1. ng tin . 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ác tham chiếu đến đối tượng bắt đầu được đếm.1 Lớp 3.vn .o rg .Phần II: Lập trình hướng đối tượng với C#. và các lớp lồng nhau. 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ạng thái sẵn sàng để sử dụng. { 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.2. Class hay còn gọi là lớp là sự gói gọn các dữ liệu và phương thức (method ) hoạt động trên dữ liệu đó. sự kiện (events). Có các loại kiểu truy xuất sau: w Từ khóa public protected w w http://www. Class có thể chứa: các trường(fields). Lớp thật (concrete class) được tạo trực tiếp.

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ưong thức . các thuộc tính(properties). http://www. Ở cấp độ cơ bản nhất của nó.internal protected internal private( định) Truy xuất nội trong chương trình (assembly) Truy xuất nội trong chương trình (assembly) và trong các lớp con.mà từ đó trình biên dịch có thể gây ra những tác động trên mã.o rg Thân lớp . 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 định nghĩa. Trong phần này ta sẽ xem xét 3 attribute sau : . Ví dụ trên trình biên dịch sẽ biên dịch mã của mục Conditional chỉ nếu biểu tượng DEBUG đã được định nghĩa trước. hay các nạp chồng toán hạng(Operator Overloads).Conditional: có thể đánh dấu bất kì phương thức với attribute Conditional.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 trong ngoặc vuông ngay trước định nghĩa mục.vn w w w .ebook. Điều này có thể được dùng cho điều kiện biên dịch. 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 hi as et 16 ho ng tin . 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ặc Chỉ được truy xuất trong nội bộ lớp Bảng 3. ứ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 cho mục đích hướng dẫn thêm.edu. constructor.2-1 Các bổ từ truy xuất 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).

. Mỗi đối tượng thuộc về một lớp đối tượng nào đó. } } 3..c hi as et ho ng tin .2 Đối tượng Ví dụ 3. public class MyClass { public static int Main( ) { . .đôi khi ta cần truy nhập đến các Window API cơ bản hoặc các hàm kiểu cũ khác mà được thực thi trong các window DLLs.edu. Đối tượng là một trị có thể được tạo ra. . kiểu chuỗi … đều là đối tượng. Nó được dùng đánh dấu 1 phương thức được định nghĩa trong Dll bên ngoài.vn 17 w w 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> w 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 đối tượng của lớp và các hành vi của chúng.attribute.1. Trong C# tất cả các biến đều là đối tượng.Dllimport . lưu giữ và sử dụng.2. public class Time { // phương thức public public void DisplayCurrentTime( ) { http://www.Obsolete . Dllimport dùng cho mục đích này. tạo và sử dựng một lớp using System.ebook. Các biến kiểu số.2-2: Khai báo. Các đối tượng có cùng lớp thì có cùng các biến thành viên và phương thức. Mỗi mộ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ương thức (hàm) để tác động lên biến thành viên.2-1: Khai báo một lớp . Tuỳ thuộc vào việc thiết lập trên attribute này.o rg Ví dụ 3. 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. 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ớ..attribute này được dùng để đánh dấu 1 phương thức được xem như obsolete ( không dùng nữa).

nếu là phương thức tức là bạn không được phép override nó. Will give compilation error http://www.vn ng tin Console. int Second.o rg .ebook. } // các biến private int Year.edu.c hi abstract class Building { public abstract decimal CalculateHeatingCost(). Nếu là lớp có nghĩa là bạn không được quyền thừa kế lớp đó. int Hour. } } Các lớp và hàm Abstract : // abstract method . } public class Tester { static void Main( ) { Time t = new Time( ). C# sử dụng từ khoá sealed trước tên lớp và phương thức: w . int Minute. int Month. int Date.sealed class FinalClass { //etc } class DerivedClass : FinalClass { //etc } class MyClass w w C# cho phép các lớp và phương thức được khai báo sealed.WriteLine( "stub for DisplayCurrentTime" ). Một lớp abstract không được thể hiện và một phương thức abstract không được thực thi mà phải được overriden trong bất kỳ lớp thừa hưởng không abstract nào. } Sealed các lớp và phương thức: as et 18 ho C# cho phép cả lớp và phương thức có thể khai báo abstract. Một phương thức abstract sẽ tự động được khai báo virtual. t. 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: // wrong.DisplayCurrentTime( ).

edu.vn 19 w w w } . thông thưòng để đọc hoặc gán giá trị cho biến thà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. Will give compilation error 3.2 Thuộc tính(properties): { Trong lớp trình C++.}] hi [get { statement.2.{ Public sealed override void FinalMethod() { //etc } } Class DerivedClass : MyClass { public override void FinalMethod() { } } // wrong. } } Property có một vài khác biệt so với hàm thành viên.o rg .ebook. 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. cài đặt Property cho biến thành viên này như sau: public string HoTen { get { return m_sHoTen. } set { m_sHoTen = value. C# cung cấp khai báo hàm chung gọi là property cho hàm get và set.}] as [bổ từ truy xuất] <kiểu trả về> <tên thuộc tính> et Để định nghĩa thuộc tính trong C# bạn dùng cú pháp sau: ho Chú ý: Trong C#. Ví dụ: trong lớp DocGia có biến thành viên m_sHoTen. Và những phương thức này cũng có trong tất cả lớp mà bạn định nghĩa.c [set { statement. ng tin . Đề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. Thứ nhất khai báo http://www.

6 7 // sử dụng property get tin . 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ị.vn w w } w .edu. Thân của phương thức truy cập get cũng giống như các phương thức khác nhưng phương thức này trả vể một đối tượng kiểu là một đặc tính của lớp. property sẽ có tính chỉ ghi. đoạn mã sau http://www. } 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. Cho một ví dụ. như trong trường hợp trên là string.HoTen. 3 4 // sử dung property set 5 dgMoi. Phương thức set có thể ghi vào cơ sở dữ liệu hay cập nhật biến thành viên khi cần. Nếu trong thân hàm không cài đặt hàm set.c hi as et 20 ho ng Property không có tham số và cặp ngoặc. Bạn không nên khai báo tường minh các tham số trong thủ tục set. khối set trong property HoTen sẽ được gọi. Ngược lại nếu không cài đặt hàm get. property sẽ có tính chỉ đọc. có biến mặc định là value. Biến value sé nhận giá trị được gán cho Property.8 string ten = dgMoi. biến value sẽ có giá trị của biến nằm sau phép gán (trong trường hợp này là "Nguyễn Van A").ebook. Cách sử dụng một Property như sau: 1 // trong thân của một hàm 2 DocGia dgMoi = new DocGia().HoTen = "Nguyễn Văn A". Public string SomeProperty { get { return “This is the property value”.o rg . 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. biến này sé mang kiểu đã được khai báo property. //ten có giá trị "Nguyễn Văn A" Ở dòng mã thứ 5. Trong thân set. phép gán sẽ bị cấm. 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.

} set { if(value.o rg . } } private string foreName.edu.ebook.Length>20) //code here to take error recovery action // (eg.chứa một thuộc tính gọi là ForeName.vn w w w 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ộc tính đó. public string ForeName { get { return 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.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ó. Throw an exception) else foreName = value. } } Bổ từ truy cập: http://www. 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.c hi Thuộc tính chỉ đọc và chỉ viết: as Khác với VB các thủ tục get và set được định nghĩa như là những hàm riêng biệt. et 21 ho ng tin . trong C# chúng được khai báo cùng nhau trong một khai báo thuộc tính đơn. Ví dụ để định nghĩa thuộc tính Forename là chỉ đọc: .

set.c public abstract string ForeName hi C# cho phép bạn tạo một thuộc tính virtual hay abstract.Text.Generic. } } protected void SetForeName( string value) { if (value.ebook. namespace vd3.2 { http://www. Để khai báo một thuộc tính virtual. public string ForeName { get { return foreName. Throw an exception) else foreName =value.Length >20) //code here to take error recovery action //(eg. Ví dụ để tạo một thuộc tính abstract thì cú pháp như sau: as et ho ng tin .edu.Collections.o rg . using System. } Ví dụ sử dụng Property: using System. } Thuộc tính Virtual và Abstract: get.vn 22 w w w { . overriden hay abstract bạn chỉ cần thêm từ khoá đó trong lúc định nghĩa thuộc tính.2. using System.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 đó.

DisplayCurrentTime(). } } // các biến thành viên kiểu private private int year. } set { hour = value.DateTime. Console.Year. http://www. date.public class Time { // public accessor methods public void DisplayCurrentTime() { Console.ebook. private int hour. private int date.Minute. } // constructors public Time(System. month. minute. private int month.Month.DateTime dt) { year = dt. date = dt.c hi as et 23 ho ng tin . year.Second. minute = dt.Day.o rg . Time t = new Time(currentTime). hour = dt. month = dt. second). } // tạo một đặc tính public int Hour { get { return hour.WriteLine("Time\t: {0}/{1}/{2} {3}:{4}:{5}". } public class Tester { static void Main() { DateTime currentTime = System.vn w w w .Now.edu. hour.Hour. private int minute. second = dt. private int second.ReadLine(). t.

ví dụ WriteLine. Console. theHour). theHour++. as 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. .edu. Hàm thà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.WriteLine("\nRetrieved the hour: {0}\n". } } 3.o rg } .WriteLine("Updated the hour: {0}\n". Thỉnh thoảng người ta gọi phương thức thành viên là hàm thành viên. et 24 ho ng Mỗi lớp có thuộc tính và hành vi.2. Console.ReadLine(). theHour).static.3 Phương thức Thành phần khai báo là các từ khóa: public. Console. Console.private… Giá trị trả về là kiểu dữ liệu mà ta có thể cho phương thức đó trả về.c hi 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. t.ebook. Hành vi được định nghĩa là phương thức thành viên của lớp. Một phương thức có thể có tham số hay không.Hour = theHour. Tuy nhiên chúng cũng có thể là các tên đặc biệt như Main(). Nếu phương thức khônng có kiểu trả về ta sử dung từ khóa void.abstract.ReadLine(). tin .vn w { //than phuong thuc } w [thành phần khai báo]<giá trị trả về><tên phương thức>(tham số) w Để 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. http://www.int theHour = t.Hour.

n = float.abstract có thể dùng để định nghĩa Method : bắt buộc phải override ở subclass.ReadLine()). Khi xây dựng phương thức.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àn dữ liệu + Các phương thức thường được khai báo public để chúng có thể gọi đến cá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:.WriteLine("Moi ban nhap vao mot so thuc").o rg . .edu. } http://www. chúng ta cần chú ý là phương thức có thể sử dụng các thành phần khác của lớp. et ho + final: Method : không cho phép override ở subclass ng + static: Method và Variable : được truy xuất trực tiệp thông qua tên class mà không cần khởi dựng đối tượng. Method này chỉ định nghĩa mà không viết đầy đủ thân.ebook.vn 25 w } w { Console.Nếu trong class có một phương thức abstract thì class đó buộc phải là abstract w public float getN() { return n. as Còn thân của phương thức có thể được thực hiện luôn trong khai báo lớp hoặc ở bên ngoài.c public void nhap() hi 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.Parse(Console. tin .

using System.ebook.ReadLine()).WriteLine("Moi ban nhap vao mot so thuc"). Input input1 = new Input(). namespace DinhNghia { class Program { //phuong thuc khong tri tra ve.Collections. n = float. http://www.WriteLine("---Tinh tong cua mot day so -----"). rg . co tham so truyen vao static void Main(string[] args) float[] arr.Text.Nếu hàm không trả về giá trị nó sẽ trả về kiểu void public void nhap() { Console. for (int i = 0. float tong=0. using System.Generic.edu.Parse(Console. i++) 26 w { .vn w w Console. } using System.ReadLine()). i < n.Write("Nhap vao so phan tu trong day ").c hi as et ho ng tin chương trình : . arr = new float[n]. Console.o //void HienThi().Parse(Console. int n = int.

for(int i=0.edu. } w { . Console. } } class Input { float n. arr[i] = input1.getN().ebook.Parse(Console.WriteLine("----Tong cua day so----").tong).vn w w Console. } //phuong thuc co tri tra ve. khong tham so truyen vao as et 27 ho ng tin .WriteLine("tong la {0}". public void nhap() http://www.nhap(). } Console.o rg { .WriteLine("Moi ban nhap vao mot so thuc").c hi //phuong thuc khong gia tri tra ve. //float tong.ReadLine()).i++) tong+=arr[i].{ //Input input1. } Console. n = float. khong thamn so truyen vao public float getN() { return n.i<n.ReadLine().

Khi muốn tạo ra thành phần phươnt thức tĩnh trong C# thì ta cần thêm từ khóa static trước kiểu trả về của phương thức.3. public.Phương_Thức_Tĩnh.} } vidu1: DinhNghia 3.1 Phương thức static .Lập trình hướng đối tượng cho phép gắn một thành phần dữ liệu hoặc một phương thức cho cả một lớp.Hàm thành phần tĩnh chịu ảnh hưởng của các quy định về đóng gói dữ liệu: private. hi as b.vn w w w .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. et 28 ho ng tin . 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ụng các dữ liệu thành phần thông thường. 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 . Thành phần tĩnh . protected. 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. Do đó. .2.c . Chỉ có một bản sao như một thực thể và các đối tượng dùng nó như nhau.Hàm thành phần tĩnh chỉ có quyền truy nhập.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. với mỗi thành phần. http://www. . Phương thức tĩnh không sử dụng được con trỏ this.ebook. Phương thức tĩnh. . chúng ta có thể hình dung chúng là một bản sao cho mỗi đối tượng được tạo ra.o rg a. Tức là tất cả các đối tượng cùng nhau chia sẻ thành phần tĩnh.Đặc điểm: .edu.

WriteLine("hien thi so {0}".Parse(Console. static float so1. //khong the nhap so2 o day vi khong phai la static void nhap() { //co the nhap ca so 1 va so 2 w http://www.Parse(Console.WriteLine("chi dung de nhap cac thanh phan static").WriteLine("nhap so1 ").ReadLine()).ReadLine()).c hi as //de nhap so 2 thi phuong thuc nhap khong dc khai bao static et } ho so1 = float.ebook.vn w } static void Main(string[] args) { 29 w Console. so1 = float. . so2 = float.Parse(Console.edu. Console.WriteLine("nhap so2"). Console.WriteLine("Nhap vao mot so").ReadLine()).o { rg static void nhap1() . ng tin Console. float so2. . Console.so).ví dụ: class Program { static float so=3.

. 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.khong the truy cap vi khong tao ra mot dooi Console.ReadLine(). chứ không phải kiểu của chính thể hiện đó.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ở đó".nhap().WriteLine("Nhap vao mot so"). 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ức năng(base Versions of Functions): http://www.o rg .2 Phương thức ảo và đa hình tuong .vn 30 w w w . 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.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.WriteLine("Nhap dc ca 2 so"). Console. } vidu 3. Console.nhap1(). pro1. ho ng tin . Trong C#.c hi as et 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 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.ebook. //pro1.2.3.--. .//khong can tao doi tuong pro1 nhap1(). //de truy cap toi nhap() can tao doi tuong pro1 Program pro1 = new Program().edu.

c CayXanh cayTao = new CayXanh("tao".ReadLine(). Console. hi as et ho ng tin . 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.xét Phương thức ảo using System. http://www. ConMeo conmeo1 = new ConMeo("meo".HienThi().WriteLine("Ket qua cua lop cay xanh").Phương thức ảo là cách thu được từ tính đa hình.HienThi(). Console.Text. } w . Hàm nạp chồng (overload) được khai báo 1 cách tường minh bằng từ khóa "override" . 0. namespace vidu3 { class Program { static void Main(string[] args) { DongVat dongVat1 = new DongVat("ga".WriteLine("ket qua cua lop con meo "). Cú pháp : base. "qua tao"). Console. "can"). Console.ebook. "can").Collections. cayTao. conmeo1. using System. using System.<methodname>().vn w } 31 w dongVat1. 4.o rg .edu.. .Trong C# có một cú pháp đặc biệt để gọi những phiên bản cơ sở của một phương thức từ một lớp thừa hưởng. "can".Generic.WriteLine("ket qua cua lop dong vat").HienThi(). 2.

moitruong = moitruong. chan. w . } //phuong thuc duoc khai bao la ao public virtual void HienThi() { } { public ConMeo(string ten. protected string moitruong.c hi public class ConMeo : DongVat as } et Console.public class DongVat { protected string ten.ebook. moitruong) Console. int chan. this. http://www. string moitruong) { this.thich an {2}".HienThi().ten = ten.chan = chan.edu. moitruong). ten. chan. ten. public DongVat(string ten. string moitruong) : base(ten.song o moi truong {2}". chan. int chan.WriteLine("con vat ma toi yeu thich la con {0} co {1} chan.WriteLine("con {0} co {1} chan .vn 32 w w { } //phu quyet phuong thuc HienThi cua lop co so public override void HienThi() { base. moitruong). .o rg this. ho ng tin . protected int chan.

song o moi truong {2}".} } public class CayXanh : DongVat { //bien cua class cayxanh private string qua.WriteLine("co su thay doi o day la : {0}".ten.vn .c hi as et 33 Console.Phương thức không có tham số http://www. string thayDoi) { qua = thayDoi.HienThi(). moitruong) . ho ng tin . } } } tạiđây w w Ban đầu ta xây dựng phương thức được khai báo là ảo: public virtual void HienThi() { w Console. } thực hiện phủ quyết phương thức HienThi() trong 2 class sau: . int chan.moitruong). chan. qua).o rg : base(ten.WriteLine("con {0} co {1} chan .chan.ebook. string moitruong. public CayXanh(string ten. } //thuc hien phu quyet phuong thuc hienthi() public override void HienThi() { base.edu.

Một phương thức abstract sẽ tự động được khai báo virtual. abstract class C{ abstract void method().HienThi().edu.3.thich an {2}".3 Phương thức trừu tượng et } ho ng tin .2. Console.HienThi().c hi . Console.o rg } . 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: .ten.moitruong). Một lớp abstract không được thể hiện và một phương thức abstract không được thực thi mà phải được overriden trong bất kỳ lớp thừa hưởng không abstract nào. 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.chan. as 3.WriteLine("con vat ma toi yeu thich la con {0} co {1} chan.Ví dụ: w w .qua). 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.//phu quyet phuong thuc HienThi cua lop co so public override void HienThi() { base.WriteLine("co su thay doi o day la : {0}".ebook.abstract có thể dùng để định nghĩa Method : bắt buộc phải override ở subclass. … } http://www.vn 34 w .

4 Phương thức ToString() w Xét phương thức ảo : nhưng sử dụng với từ khóa abstract w .ToString().edu. int chan. //{ //} } vidu4 .chan = chan.moitruong = moitruong. protected string moitruong.o this.WriteLine("con {0} co {1} chan . et 35 ho ng tin this.c hi as // Console. . moitruong). string intString=myInterger.ebook. ví dụ: int myInterger=5.Đây là phương thức của đối tượng object (và chứa tất cả các đối tượng khác) thường dùng để chuyển đổi một đối tượng bất kỳ sang kiểu chuỗi. protected int chan. } //phuong thuc duoc khai bao la ao public abstract void HienThi(). chan. string moitruong) this.song o moi truong {2}".3. public DongVat(string ten. rg { .ten = ten.public abstract class DongVat { protected string ten. http://www.vn w 3.2. ten.

2. Destructors w w { } .Chuỗi intString có gí trị là “5” bằng cách này ta cũng có thể tạo ra một chuỗi mới. hi } as et 36 ho ng tin .String. Như vậy ta cũng tạo được chuỗi từ mảng ký tự. http://www. điều khiển chương trình ngay khi khởi tạo đôi tượng. Chuỗi cũng có thể được tạo thông qua hàm dựng của lớp System. Lớp này có hàm dựng nhận vào một mảng các ký tự. Là một hàm đặc biệt được sử dụng để làm sạch bộ nhớ. Cách khai báo giống như Constructor nhưng không có tham số và được bắt đầu bằng dấu “~”. Constructors có tên giống như tên của Class và không trả lại giá trị. Constructors Constructors là những hàm đặc biệt cho phép thực thi.o rg .vn w } b.3.ebook.edu. 3. //Constructor public Library() { ibooktypes = 7.c public Library(int value) ibooktypes = value. Trong C#. Ví dụ: class Library { private int ibooktypes.5 Hàm tạo (Constructors) và hàm hủy (Destructors) trong C# a.

rg { . } ~ Library() { //thực thi câu lệnh } } 3. //Constructor public Library() public Library(int value) { ibooktypes = value.vn 37 w 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.edu.4 Nạp chồng phương thức 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.Ví dụ class Library { private int ibooktypes.ebook.o ibooktypes = 7. Danh sách tham số được xem là khác nhau bởi số lượng các tham số hoặc là kiểu dữ liệu của tham số. phương thức thứ nhất khác phương thức thứ hai do số lượng tham số khác nhau. Hai phương thức khác nhau khi ký hiệu của chúng khác là khác nhau tức là khác nhau khi tên phương thức khác nhau hay danh sách tham số khác nhau. Phương thức thứ hai khác phương thức thứ ba do kiểu dữ liệu tham số khác nhau: http://www. w w .c hi as et ho ng tin } . Ví dụ đoạn mã sau.2.

o rg . } public Time(int Year. string p2 ).void myMethod( int p1 ). Date = dt. public class Time { public void DisplayCurrentTime() { Console. Date. this.Year.Date = Date. Minute.Month.ebook.vn w w w . } public Time( System. int Date. int Minute.Hour. } http://www. this. this. Hour. Hour = dt. ----------------------------------------------------------------------------- using System.DateTime dt) { Year = dt. Ví dụ 1: Minh họa nạp chồng phương thức khởi dựng. Month = dt. Một lớp có thể có bất cứ số lượng phương thức nào. void myMethod( int p1. Minute = dt. void myMethod( int p1. Second = dt.Second = Second.Minute = Minute. int Second) { this. int Month. this. this.c hi as et 38 ho ng tin . Ví dụ 1: minh họa lớp Time có hai phương thức khởi dựng. Year.Second. Month. int p2 ).edu. 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òn lại của lớp. Second).Day. một phương thứ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.Hour = Hour.Minute.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”. int Hour.Month = Month.Year = Year.

hay kiểu dữ liệu của tham số. Nếu chỉ 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. http://www.DateTime currentTime = System.ebook.15.8. } } ng tin .6. private int Hour.----------------------------------------------------------------------------2/1/2002 17:50:17 8/6/2002 18:15:20 Như chúng ta thấy. t1.DateTime.o rg .DisplayCurrentTime(). private int Month. Tuy nhiên. do đó trình biên dịch sẽ xác định được phương thức nào được gọi dựa vào các tham số. Time t1 = new Time( currentTime). Chúng ta cũng có thể toàn quyền thay đổi giá trị trả về. nhưng đây là tùy chọn. lớp Time trong ví dụ 1 có hai phương thức khởi dựng.DisplayCurrentTime(). bắt buộc chúng ta phải thay đổi ký hiệu của phương thức. Time t2 = new Time(2002. và nếu tạo ra hai phương thức cùng ký hiệu nhưng khác nhau kiểu giá trị trả về sẽ tạo ra một lỗi biên dịch. private int Date. Khi thực hiện nạp chồng một phương thức.vn 39 w w w .20). ký hiệu của hai phương thức này khác nhau vì tham số truyền vào khác nhau.18. t2.Now. private int Minute.c ----------------------------------------------------------------------------- hi as Kết quả: et ho // Biến thành viên private private int Year.edu. private int Second. số tham số. 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. } public class Tester { static void Main() { System.

----------------------------------------------------------------------------using System. x.Ví dụ 2: Nạp chồng phương thức. phương thức còn lại nhận tham số là số http://www. } static void Main() { Tester t = new Tester().vn w Kết quả: w ----------------------------------------------------------------------------- w } . public class Tester { private int Triple( int val) { return 3*val.WriteLine(“x: {0} y: {1}”. } public void Test() { int x = 5.o rg . y). int y = Triple(x). long ly = Triple(lx).edu. long lx = 10.c hi as et 40 ho ng tin . Console. ly). Console. } private long Triple(long val) { return 3*val.WriteLine(“lx: {0} ly:{1}”. lx. t. } 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.Test().ebook.

Lớp dẫn xuất cũng có thể tạo một phương thức mới bằng việc đánh dấu với từ khóa new.Object. Cú pháp: class MyDerivedClass : MyBaseClass { // functions and data members here } public class ListBox : Window Ví dụ 3: Sử dụng lớp dẫn xuất. lớp này được dẫn xuất từ Window.o rg .2. Lớp dẫn xuất được tự do thực thi các phiên bản của một phương thức của lớp cơ sở. Kiểu giá trị trả về của hai phương thức khác nhau.left = left. et 41 ho Đoạn lệnh trên khai báo một lớp mới tên là ListBox. } // mô phỏng vẽ cửa sổ public void DrawWindow() http://www. ng tin Trong C# một lớp bắt buột phải thừa kế từ một lớp nào đó.c ----------------------------------------------------------------------------- hi as 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ở. Trong ngôn ngữ C# để tạo một lớ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ở: .2. Một lớp có thể thừa hưởng những thuộc tính và phương thức từ một lớp khác. Ví dụ 3 sau minh họa việc tạo và sử dụng các lớp cơ sở và dẫn xuất. mặc dù điều này không đòi hỏi nhưng rất thích hợp trong trường hợp này.ebook.vn w w w .nguyên long.1 Sự kế thừa C# hỗ trợ đơn thừa kế giữa các lớp.edu.5 Kế thừa 3.5. 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. bao gồm tất cả các phương thức và biến thành viên của lớp cơ sở. this. 3. int left) { this. using System. C# hỗ trợ một lớp cơ sở toàn diện gọi là System.top = top.

c hi as et 42 ho ng tin .DrawWindow(). string theContents) : base(top. private int top. } // 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. mListBoxContents). lb. } // 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. int left.o rg . w. left) // gọi khởi dựng của lớp cơ sở { mListBoxContents = theContents. private int left. } public class Tester { public static void Main() { // tạo đối tượng cho lớp cơ sở Window w = new Window(5. “Hello world!”). 10). Console. } // ListBox dẫn xuất từ Window public class ListBox: Window { // Khởi dựng có tham số public ListBox(int top.{ Console. 10. left).vn w w w .DrawWindow().WriteLine(“Drawing Window at {0}. top. {1}”. // tạo đối tượng cho lớp dẫn xuất ListBox lb = new ListBox( 20.edu. } http://www.ebook.WriteLine(“ ListBox write: {0}”.DrawWindow(). } // biến thành viên private private string mListBoxContents.

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.Object. Tuy nhiên. 10 Drawing Window at: 20. 10 ListBox write: Hello world! ----------------------------------------------------------------------------3. Một lớp cơ sở là cha trực tiếp của một lớp dẫn xuất. 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ế. 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.c hi as et 43 Từ khóa base chỉ đến lớp cơ sở cho đối tượng hiện hành. Trong ngôn ngữ C#. còn các lớp dẫn xuất thì nằm bên dưới.edu.} ----------------------------------------------------------------------------Kết quả: Drawing Window at: 5. http://www. Và phương thức ToString () trả về một chuỗi thể hiện lớp hiện hành. // gọi phương thức cơ sở. 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.DrawWindow() của lớp cơ sở Window. lớp này nằm trên cùng trong cây phân cấp các lớp. ho Trong ví dụ 3.2.DrawWindow(). không phải phương thức Window.DrawWindow() sẽ được thực hiện. 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.vn w w w .ebook. 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. Gọi phương thức của lớp cơ sở base. Thú vị là bao gồm cả các kiểu dữ liệu giá trị.2. ta có thể gọi phương thức DrawWindow() của lớp cơ sở thông qua từ khóa base: ng tin . 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. Phương thức GetType() trả về kiểu của đối tượng.o rg . lớp gốc là lớp Object. 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.

SomeClass s = new SomeClass(7). MemberwiseClone( ): Tạo một bản sao từ đối tượng. Dọn dẹp các tài nguyên.WriteLine(“The value of 5 is {0}”. s.vn 44 w w w . Ví dụ 5: Thừa kế từ Object.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. Cung cấp chuỗi thể hiện của đối tượng. ----------------------------------------------------------------------------- using System.ToString()). GetType( ): ToString( ): Finalize( ): Cung cấp kiểu của đối tượng. } public class Tester { static void Main( ) { int i = 5.edu.WriteLine(“The value of i is: {0}”.WriteLine(“The value of s is {0}”.o rg . public class SomeClass { public SomeClass( int val ) { value = val. i. Ví dụ 5 sau minh họa việc sử dụng phương thức ToString( ) thừa kế từ lớp Object.ToString().ToString()). } // phủ quyết phương thức ToString của lớp Object public virtual string ToString() { return value.ebook.5. } // biến thành viên private lưu giá trị private int value.ToString()). Console. Console. } } ----------------------------------------------------------------------------http://www. Console.c hi as et ho ng tin .

vn w w 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.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áo như sau: Đây là phương thức ảo public. 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. do đó phương thức này sẽ trả về giá trị có nghĩa. 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.edu. Nếu chúng ta không phủ quyết phương thức ToString() trong lớp SomeClass. như kiểu int.c hi as et 45 ho ng tin . Lớp SomeClass trong ví dụ trên thực hiện việc phủ quyết phương thức ToString(). 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. 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. .o rg public virtual string ToString(). Phương thức Overriden và Hide: http://www.ebook. } } w . Tất cả kiểu dữ liệu được xây dựng sẵn. việc kế thừa sẽ được đưa vào một cách ngầm định. phương thức này trả về một chuỗi và không nhận tham số. 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. Do đó ta mới có thể phủ quyết phương thức ToString() của lớp Object. phương thức của lớp cơ sở sẽ được thực thi. class MyBaseClass { public virtual string VirtualMethod() { return "This method is virtual and defined in MyBaseClass".

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 { public override string VirtualMethod() { return "This method is an override defined in MyDerivedClass". Khác với C++ và Java. bạn nên sử dụng từ khoá new để đảm bảo bạn muốn hide phương thức đó. using System. chứ không phải kiểu của chính thể hiện đó. 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ở đó". this. Bởi vì hide dễ gây ra những lỗi nghiêm trọng.edu.vn w w Ví dụ 5: Sử dụng phương thức ảo.o rg .left = left. 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. ----------------------------------------------------------------------------- http://www.Như ví dụ trên. 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. 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. } } 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. 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ở. 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.ebook. Trong C#.top = top.c hi as et ho ng tin . public class Window { public Window( int top. } 46 w . 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ó. int left ) { this.

DrawWindow(). left ). } // thực hiện việc phủ quyết phương thức DrawWindow public override void DrawWindow() { base. ListBox lb = new ListBox( 3. b. win. left).vn w w w . top. Window[] winArray = new Window[3]. lb. } public class ListBox : Window { // phương thức khởi dựng có tham số public ListBox( int top. } } public class Tester { static void Main() { Window win = new Window(1.c hi as et 47 ho ng tin . 6 ).o rg . “ Stand alone list box”). int left. protected int left. Button b = new Button( 5. string contents ): base( top.DrawWindow().DrawWindow().2).WriteLine(“ Writing string to the listbox: {0}”. Console.DrawWindow(). top. } // biến thành viên của lớp protected int top. } // phủ quyết phương thức DrawWindow của lớp cơ sở public override void DrawWindow() { Console. http://www.edu. {1}”. left) { listBoxContents = contents. 4.// phương thức được khai báo ảo public virtual void DrawWindow() { Console. listBoxContents).WriteLine( “Window: drawing window at {0}.WriteLine(“ Drawing a button at {0}: {1}”.ebook.

..edu.....ebook.......... 2 )..... for( int i = 0.......... } } } ----------------------------------------------------------------------------Kết quả: Window: drawing window at 1: 2 Window: drawing window at 3: 4 Drawing a button at 5: 6 Window: drawing Window at 1: 2 Window: drawing window at 3: 4 Drawing a button at 5: 6 Writing string to the listbox: Stand alone list box http://www.............. winArray[1] = new ListBox( 3.. as Writing string to the listbox: List box is array et 48 ho ng tin .... winArray[2] = new Button( 5... 4.. “List box is array”).....winArray[0] = new Window( 1..........o rg .........DrawWindow(). ......vn w w w .. 6 ).c hi ........... i < 3............. i++) { winArray[i].

thuộc tính.c hi as et 49 ho ng tin . 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#.vn w w w .o rg .thành phần làm nên một chương trình hướng đối tượng . 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.và lập trình hướng đối tượng trong C#.ebook.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 .edu. 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. http://www.

vn w w w .ebook.vn/Desktop.aspx 6.NET và C# (C Shape) .net.0 Tác giả: Mark Michaelis – Nguồn: http://www.edu.vn/gvst/forums/86. VB.com 5.net.c hi as et 50 ho ng tin .o rg .vn/?page=1. Phạm Minh Tuấn. Website: 4.Thư viện cộng đồng .edu.NET Việt Nam.Mạng giáo viên sáng tạo: http://mspil.ebook. Bùi Tấn Lộc(Đại học KHTN-ĐHQG TPHCM) – Nguồn: http://www.congdongcviet.Danh mục tài liệu tham khảo Ebook: 1.1&view=9331 3. Bài giảng lập trình C# Tác giả: Phạm Anh Phương.edu.vn/?page=1.NET .aspx/dotNET-Libraries/dotNET-eBooks/ http://www.1&view=9461 2. Lập trình . Programming in C# Tác giả: Aptech Limited.ebook. Essential C# 2. http://dot. http://www.

..3 Trừu tượng hóa dữ liệu (Abstraction).........1...................2........3......3... kế thừa giữa các lớp (Inheritance)....2...........3 Phương thức trừu tượng ................................................................15 rg ...................................5....3..................................................................vn w w w ...................................41 3............................................1 3...............................4 NẠP CHỒNG PHƯƠNG THỨC .......................1...............35 3..........................41 3..........................2.......................................1 LỚP ...4 Phương thức ToString() .......8 Truyền thông điệp (Message Passing).......1.1........15 3...........................................................................34 3.........14 3..3........2 Phương thức ảo và đa hình...........................................................................................3..........37 3..................................................11 3...........1..12 3.......1..............................................1.....................3.........................3........................6 Đa xạ (tương ứng bội) và nạp chồng (Polymorphism and Overloading)..........................2 Lớp đối tượng..........28 3.......9 3....36 3...c hi as et 51 ho ng tin .edu...............19 3...1...............5 Sự mở rộng.ebook...... ........................................13 3.....................................1...............................4 Bao gói và che giấu thông tin (Encapsulation and Information Hiding) .....................................2................................1 Đối tượng ..........................................................3................................2.......................5 KẾ THỪA ....5 Hàm tạo (Constructors) và hàm hủy (Destructors) trong C#...15 3.........................1 Định nghĩa lớp ................................2............ Gọi phương thức của lớp cơ sở ............................................3........1 Sự kế thừa ...2.....o PHẦN II: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C#..2........11 3.....................2 CÁC TÍNH CHẤT CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG ..............3.2................17 3............1 Phương thức static ........................1.................1 GIỚI THIỆU VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG.......................10 3......2.........8 3....................................3.......................................43 http://www......5.....................NET ..........8 3....1.................7 3..2 Đối tượng ....................PHẦN I: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG.3 CÁC KHÁI NIỆM TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG .........3.............2.....................3.....2 3..30 3.................2...........1...........................2 THUỘC TÍNH(PROPERTIES): ............................1............7 Liên kết động (Dynamic binding) ......................................2...............24 3..........2.......3 PHƯƠNG THỨC.........................2.................................................

Sign up to vote on this title
UsefulNot useful