kiem tien, kiem tien online, kiem tien truc tuyen, kiem tien tren mang
Thứ Ba, 11 tháng 10, 2011

I. Giới thiệu về lớp (class) và đối tượng (object)

Theo mình nghĩ lập trình hướng đối tượng là nền tảng trong lập trình C# trong đó các đối tượng (object) và các lớp (class) đóng vai trò vô cùng quan trọng không thể thiếu để tạo nên tính hướng đối tượng của C#. Class mô tả tất cả các thuộc tính của một tập hợp các đối tượng cụ thể, nó như một khuôn mẫu bao gồm một tập hợp các đối tượng có tính chất tương tự nhau.

II. Các thực thể trong thế giới thực như là các đối tượng
Để mọi người dễ hiểu hơn chúng ta sẽ cùng nhau tìm hiểu ví dụ sau:


Tớ có 1 tập hợp các hình sau mà chúng ta đều nhìn thấy ở quanh mình như: Chó, mèo,
ô-tô (car), ngôi nhà, bông hoa…Chúng ta đều thấy điểm chung ở các ví dụ đó là chúng là những vật hữu hình, chúng ta có thể sờ mó được vào nó và người ta gọi đó là đối tượng trong thế giới thực.
Mỗi một đối tượng chúng đều có các thuộc tính hoặc tính chất để mô tả nó và giúp chúng ta phân biệt đối tượng đó với đối tượng khác.



Ví dụ với đối tượng là con chó các thuộc tính của nó như: 


Và ngoài ra đối tượng con chó còn được thể hiện bằng cách hành động như:



Vậy từ các ví dụ trên chúng ta rút ra được nhận xét sau:
Hai yếu tố quan trọng nhất của đối tượng trong thể giới thực là: thuộc tính (attribute) và hành động (action). Đối tượng có các thuộc tính và hành động hoàn toàn xác định.
Bây giờ quay lại với thế giới phần mềm, các đối tượng cũng được mô tả theo trạng thái và hành vi của nó. Trạng thái được định nghĩa như các thuộc tính và hành vi được định nghĩa như các hành động, hoạt động của một đối tượng phần mềm. Các hành vi được xem như là các phương thức, giống như các hàm trong ngôn ngữ lập trình. Một phương thức là một chuỗi các câu lệnh được đặt tên nhằm thực hiện các tác vụ cụ thể nào đó.
Sự thuận lợi khi sử dụng đối tượng (object) là:
+, Nó giúp chúng ta hiểu hơn về thế giới thực.
+, Nó ánh xạ các thuộc tính và các hành động của các đối tượng trong thế giới thực thành trạng thái và hành vi của các đối tượng phần mềm.

III. Class (lớp)
Như chúng ta biết trong thế giới thực có nhiều loài động vật khác nhau như gà, lợn, mèo, chim…Và như chúng ta đã xét chó là một đối tượng của thế giới thực vì vậy chó chỉ là một thể hiện của lớp động vật.
Bây giờ chúng ta có một số đối tượng có các thuộc tính và hành động chung và chúng ta nhóm nó lại thành một đơn vị và đơn vị này được dùng để tạo ra một đại diện của loại tương ứng gọi là lớp (class). Mỗi một lớp mô tả một tập hợp các đối tượng riêng lẻ. Tất cả các thể hiện của lớp được gọi là đối tượng, sẽ có chung các trạng thái và hành vi.

Chú ý: Các thuộc tính và hành động có thể được gán chỉ sau khi một đối tượng được tạo ra. Khi một đối tượng được tạo ra, lúc đó ta mới có một đại diện thật sự của một thực thể.

IV. So sánh giữa lớp (class) và đối tượng (object)

Như trên mình đã phân tích thì một lớp (class) mô tả một thực thể, trong khi đó thì một đối tượng (object) là một thực thể thực sự. Điều này không khác gì việc bạn so sánh giữa khái niệm loài chó và một con chó Nhật. Chúng ta không thể đụng chạm hay đùa giỡn với khái niệm loài chó nhưng có thể thực hiện điều đó được với con chó Nhật, nó là một thực thể sống động, chứ không trừu tượng như khái niệm họ loài chó.

“Như trên mình đã phân tích thì một lớp (class) mô tả một thực thể, trong khi đó thì một đối tượng (object) là một thực thể thực sự. Điều này không khác gì việc bạn so sánh giữa khái niệm loài chó và một con chó Nhật.”

I. Định nghĩa lớp: 
Chúng ta đã hiểu được định nghĩa của lớp là gì, bây giờ mình sẽ nêu ra cấu trúc khai báo một lớp (class). Khai báo một lớp bằng cách sử dụng từ khóa class, cú pháp đầy đủ:

PHP Code:
[thuộc tính] [bổ sung truy cập] class định danh lớp [: lớp cơ sở]
{

} 
Nhìn vào cái kia chắc sẽ khó hiểu, tớ sẽ giải thích cho mọi người từng phần một.
Dấu []: có thể có hoặc không.
[thuộc tính]: thuộc tính của đối tượng chúng ta sẽ tìm hiểu ở phần sau.
[bổ sung truy cập]: cái này tớ sẽ nói ngay cuối phần 2 mọi người theo dõi.
Định danh lớp: chính là tên lớp do người lập trình tự đặt, nó giống như chúng ta mỗi người đều có một tên vậy nhưng trong lập trình người ta thường đặt những tên mang tính chất gợi mở để thuận tiện cho việc đọc lại code về sau hay khắc phục lỗi.
[lớp cơ sở]: là lớp mà đối tượng sẽ kế thừa. Như trên đầu mình có nói thì các bạn sẽ hiểu được nó kỹ hơn ở phần 3 trong bài liên quan đến kế thừa (inheritance).
Tất cả các thành viên của lớp được định nghĩa ở bên trong thân của lớp trong cặp dấu {}.

Chú ý: Trong C# kết thúc của lớp không có dấu ; giống như C++, tuy nhiên có cũng hem sao chỉ báo lỗi thôi nhưng vấn chạy bình thường. Nhưng mà tốt nhất là không cho gì vào cả.

Ví dụ: tớ sẽ cho mọi người 1 ví dụ thật đơn giản như hằng ngày chúng ta vẫn thấy

Visual C# Code:

public class Khoaimon
{
public static void Main (string[] args)
{
//viết các câu lệnh…
}
}
Nhìn vào ví dụ trên chúng ta thấy hoàn toàn chưa tạo bất cứ thể hiện nào của lớp, lớp Khoaimon chưa có đối tượng gì cả. 

Bây giờ chúng ta sẽ tới ví dụ tiếp theo để tìm hiểu cách tạo một lớp và tạo các thể hiện của chúng.


Visual C# Code:

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

namespace ConsoleApplication23
{
public class khoaimon
{
public void khoailang()
{
Console.WriteLine("khoaimon kute");
}

public class khoaitay
{
static void Main(string[] args)
{
khoaimon k = new khoaimon();
k.khoailang();
Console.ReadLine();

}
}
}
}
Lớp khoaimon chỉ có 1 phương thức là khoailang(), phần thân của phương thức này được định nghĩa bên trong lớp khoaimon. Sau khi đã định nghĩa lớp khoaimon tớ sang định nghĩa tiếp lớp khoaitay, lớp này chứa một hàm Main(). Bên trong hàm Main chứa một thể hiện của lớp khoaimon được tạo ra và gán giá trị cho đối tượng k. Như các bạn thấy trong hàm Main() này có câu lệnh sau:
k.khoailang();
Sở dĩ có câu lệnh này là vì k là thể hiện của đối tượng khoaimon nên nó có thể sử dụng tất cả các phương thức của k.
Từ khóa new dùng để tạo một đối tượng.
Đến đây có lẽ chúng ta đã nắm bắt được cú pháp để khai báo và cách sử dụng lớp(class). 
Từ những ví dụ của mình từ đầu tới giờ có không ít những từ như public, private cả khi khai báo trong class tớ cũng dùng nó vậy nó có nghĩa là gì? Vì phần này liên quan đến class và cách tham chiếu từ class hay method này tới class, method khác nên tớ sẽ giới thiệu cho mọi người hiểu hơn về nó. 

II. Thuộc tính truy cập

Thuộc tính truy cập quyết định khả năng các phương thức của lớp (class) bao gồm việc các phương thức của lớp khác có thể nhìn thấy và sử dụng các thành viên hay những phương thức bên trong lớp.
Sau đây là tổng hợp các thuộc tính truy cập của một lớp trong C#:

+, public: không hạn chế. Những thành viên được đánh dấu public có thể được dùng bởi bất kỳ các phương thức của lớp bao gồm những lớp khác.
+, private: riêng tư chỉ có phạm vi hoạt động trong lớp mà nó khai báo. Các phương thức bên ngoài lớp không thể truy xuất đến nó.
+, protected: các thành viên trong lớp được khai báo bằng protected thì chỉ có các phương thức bên trong lớp và các lớp dẫn xuất từ lớp đó mới có thể truy cập đến nó.
+, internal: các phươn thức, các biến thành viên được khai báo bằng từ khóa internal có thể được truy cập bởi tất cả những phương thức của bất kỳ lớp (class) nào trong cùng một khối hợp ngữ với lớp (class) đó.
+, protected internal: các biến thành viên được khai báo bằng từ khóa trong một lớp A bất kỳ có thể được truy xuất bởi các phương thức thuộc lớp A và các phương thức của lớp dẫn xuất từ lớp A và bất cứ lớp nào trong cùng một khối hợp ngữ với lớp A.

Chú ý: 
+, Các thuộc tính truy cập được áp dụng cho thuộc tính, phương thức của lớp và bản thân lớp. Khi định nghĩa thuộc tính truy cập của lớp là internal, protected chỉ được định nghĩa trong lớp lồng nhau mà thôi.
+, Khi lập trình hãy tạo cho mình một thói quen là khai báo tường minh các thuộc tính truy cập của biến thành viên hay các phương thức trong một lớp. Việc này sẽ giúp chương trình của chúng ta dễ hiểu hơn.
+, Mặc định các thành viên của lớp được khai báo là private.

* Các thuộc tính chính yếu của hướng đối tượng trong C# là tính trừu tượng (abstraction), đóng gói (encapsulation), kế thừa (inheritance) và đa hình (polymorphism).

1. tính trừu tượng (abstraction):
Là lớp có ít nhất một phương thức trừu tượng. Khi xây dựng lớp trừu tượng thì mọi thành viên được định nghĩa trong lớp trừu tượng đều sử dụng từ khoá abstract.

Phương thức trừu tượng không có sự thực thi. Phương thức này chỉ đơn giản tạo ra một tên phương thức và kí hiệu phương thức. Nó không định nghĩa phần thân, thay vào đó chúng được cài đặt trong phương thức ghi đè của lớp dẫn xuất.
Để khai báo lớp trừu tượng bạn sử dụng từ khoáabstract trước từ khoá class như cú pháp sau:

Trích dẫn:
abstract class baseclass
{
// Code of members
}

2. tính đóng gói (encapsulation): 
Tính đóng gói là một cách mô phỏng đời thật của lập trình hướng đối tượng. Trong cuộc sống thật, khi bạn có một cái máy, bạn biết cách khởi động nó, bạn biết cách nhấn nút để điều khiển trò chơi nhưng bạn không cần quan tâm xem bên trong cái máy ấy có những linh kiện gì và cũng không biết các linh kiện ấy hoạt động, tương tác với nhau như thế nào. Trong lập trình cũng vậy. Giả như bạn tạo ra một lớp trong C# tên là Khoaimon. Bạn khai báo các biến đối tượng, nhưng bạn không để lộ thông tin đó ra bên ngoài. Người dùng lớp Khoaimon mà bạn tạo, không biết được là bạn tạo cái lớp Khoaimon đó thế nào (và thực sự là người ta cũng không cần biết). Cái người ta cần biết là khi tạo ra một lớp, bạn phải cung cấp một tài liệu về cách sử dụng cái lớp đó (cách tạo đối tượng từ lớp đó, cách gọi phương thức từ lớp đó ...v...v...). Sau đó người ta chỉ việc gọi phương thức từ lớp đó thôi chứ không cần biết lớp đó đã được tạo thế nào. Gọi phương phương thức mà không cần biết nó được tạo ra như thế nào cũng giống như việc chơi CF mà không cần biết bên trong hoạt động ra sao. --> tính đóng gói giúp bảo mật thông tin, tránh những can thiệp không cần thiết, giảm hỏng hóc, kiểm soát được trạng thái của đối tượng.

3. tính kế thừa (inheritance):
Một lớp con được thừa hưởng tất cả các thuộc tính và phương thức của lớp cha, như thế gọi là kế thừa. Tại sao phải kế thừa? Vì không có kế thừa thì không có đa hình (polymorphism). Kế thừa giúp tiết kiệm code, giúp chương trình dễ dàng bảo trì, nâng cấp, nhờ đó mà tiết kiệm được chi phí. Nếu lớp B là lớp được kế thừa từ lớp A thì toàn bộ các thành phần của lớp A cũng có mặt trong lớp B mà không cần phải khai báo trong lớp B. Lớp A được gọi là lớp cơ sở hay lớp cha, còn lớp B được gọi là lớp dẫn xuất hay lớp con. Như vậy chúng ta không cần viết đi viết lại các đoạn code giống nhau nữa, mà chỉ cần viết những đoạn code khác nhau ở các lớp con thôi. Còn những đoạn code giống nhau thì lớp con nào cũng có, vì nó đã được kế thừa từ lớp cha. --> đây là một biểu hiện của việc dùng lại code.
Kế thừa có hai loại: Đơn kế thừa và đa kế thừa trong đó đơn kế thừa là một lớp dẫn xuất chỉ được kế thừa từ một lớp cơ sở, còn đa kế thừa là một lớp dẫn xuất được kế thừa từ nhiều lớp cơ sở.

Cách khai báo:
lớp dẫn xuất kế thừa một lớp cơ sở :
Tên lớp dẫn xuất : Tên lớp cơ sở.

ví dụ:
Visual C# Code:

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

namespace ConsoleApplication26
{
class Person
{ 
public void Talk()
{
Console.WriteLine("Khoaimon kute");
}
}
class A : Person
{
public void Say()
{
Console.WriteLine("Khoaimon baby");
}

public static void Main(string[] args)
{
A a = new A(); 
a.Talk();
a.Say();
Console.ReadLine();
}
}

}
4. tính đa hình (polymorphism):
Polymorphism (đa hình): Đa hình chính là mục tiêu lớn nhất của kế thừa (inheritance). Việc override hoặc overload một phương thức là biểu hiện của đa hình.
Phương thức là đa hình có từ khoá Virtual ở trước và phương thức này phải được ghi đè ở lớp dẫn xuất.
Cho phép cài đặt phương thức của lớp dẫn xuất trong khi thi hành .

ví dụ:

Visual C# Code:

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

namespace ConsoleApplication26
{
class Shape
{
public virtual void ShapeType()
{
Console.WriteLine("phuong thuc nay se duoc su dung");
}
public int CalculateArea(int side)
{ 
return side*side;
}
public double CalculateArea(double baseBreadth, double height)
{
return 0.5 * baseBreadth * height;
}

}

class Square : Shape
{
public override void ShapeType()
{
Console.WriteLine("A square is a polygon");
}
static void Main(string[] args)
{
Square sq = new Square();
sq.ShapeType();
Shape sh = new Shape();
Console.WriteLine("Are is: " + sq.CalculateArea(6));
Console.ReadLine();
}
}
}

0 nhận xét:

Đăng nhận xét

domain, domain name, premium domain name for sales

Bài đăng phổ biến