06 Nap Chong Toan Tu

20
Chương 6: NP CHNG TOÁN TỬ   Lp trình W eb 1 Lp trình Web 

Transcript of 06 Nap Chong Toan Tu

Page 1: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 1/20

Chương 6:

NẠP CHỒNG TOÁN TỬ  

 Lập trình Web 

1 Lập trình Web 

Page 2: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 2/20

Nội dung 

Sử dụng từ khóa operator. Hỗ trợ ngôn ngữ .NET khác. 

Sử dụng toán tử.

Toán tử so sánh bằng. Toán tử chuyển đổi. 

Câu hỏi & bài tập.

Lập trình Web  2

Page 3: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 3/20

Sử dụng từ khóa operator 

Trong ngôn ngữ C#, các toán tử là các phương thức tĩnh.

Giá trị trả về của nó thể hiện kết quả của toán tử, các thamsố là các toán hạng. 

Việc tạo toán tử cho một lớp cũng giống như việc nạp chồng

(overload) phương thức của lớp. 

Toán tử được khai báo với từ khóa operator :

Ví dụ:  public static PhanSo operator  * (PhanSo a, PhanSo b){

......

}

Lập trình Web  3

Page 4: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 4/20

 

Lập trình Web  4

public class PhanSo{

int tu;

int mau;

public PhanSo(int t, int m){tu = t;

mau = m;

}

public override string ToString(){

return tu.ToString()+"/"+mau.ToString();

}public static PhanSo operator *(PhanSo a, PhanSo b){

return new PhanSo(a.tu * b.tu, a.mau * b.mau);

}

static void Main(){

PhanSo a = new PhanSo(2, 3);

PhanSo b = new PhanSo(4, 5);PhanSo c = a * b;

Console.WriteLine(c.ToString());

}

Page 5: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 5/20

Hỗ trợ ngôn ngữ .NET khác 

 Nạp chồng toán tử rất tiện dụng nhưng không phải ngônngữ nào cũng hỗ trợ nạp chồng toán tử ( ví dụ như: VisualBasic, Java,…) 

Vậy làm thế nào để gọi thực hiện toán tử của một lớp viết bằng C# trong một lớp không hỗ trợ nạp chồng toán tử? 

Page 6: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 6/20

Khi định nghĩa một toán tử trong C#, toán tử này sẽ đượctrình biên dịch biên dịch thành một phương thức tĩnh đặc

 biệt trong ngôn ngữ IL.  Chi tiết tên các phương thức của các toán tử như trong

 bảng sau: 

Page 7: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 7/20

C# Operator  Symbol 

Special Method Name 

+  op_UnaryPlus 

- op_UnaryNegation 

~  op_OnesComplement ++ op_Increment 

—  op_Decrement 

+ op_Addition 

+=  op_AdditionAssignment 

- op_Subtraction 

-= op_SubtractionAssignment 

* op_Multiply 

*= op_MultiplicationAssignment 

/ op_Division 

Page 8: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 8/20

C# Operator  Symbol 

Special Method Name 

/= op_DivisionAssignment 

% op_Modulus 

%= op_ModulusAssignment 

^ op_ExclusiveOr 

^= op_ExclusiveOrAssignment 

& op_BitwiseAnd 

&= op_BitwiseAndAssignment 

| op_BitwiseOr 

|= op_BitwiseOrAssignment 

&& op_LogicalAnd 

! op_LogicalNot 

Page 9: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 9/20

C# Operator  Symbol 

Special Method Name 

<< op_LeftShift 

<<= op_LeftShiftAssignment 

>> op_RightShift 

>>= op_RightShiftAssignment 

== op_Equality 

!= op_Inequality 

< op_LessThan 

> op_GreaterThan 

<= op_LessThanOrEqual 

>= op_GreaterThanOrEqual 

=  op_Assign 

Page 10: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 10/20

VB.NET không cho phép một lớp định nghĩa toán tử, vànó cũng ko thể chuyển code sử dụng ký tự + thành gọi

 phương thức op_Addition được. 

Do đó để gọi thực thi toán tử + trong VB.NET ta gọi thựcthi phương thức Op_Addition 

Csharp define

operator +

Op_Addition methodgenerate

Visual Basic

  c  a   l   l

Hỗ trợ ngôn ngữ .NET khác 

Page 11: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 11/20

 public class CSharp {

public static CSharp operator+(CSharpType a,

CSharpType b) {

return null;

}}

Public Class VBApp 

Public Shared Sub Main()Dim cs as new CSharpType()

cs = CSharpType.op_Addition(cs, cs)

End Sub

End Class

Hỗ trợ ngôn ngữ .NET khác 

Page 12: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 12/20

Hỗ trợ ngôn ngữ .NET khác 

Khi định nghĩa toán tử ta nên định nghĩa thêmmột phương thức có tên thân thiện hơn và bêntrong nó gọi thực thi toán tử. 

Ví dụ: 

Page 13: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 13/20

Hỗ trợ ngôn ngữ .NET khác 

public class Some {public static Some operator+(CSharpType a,

CSharpType b) {

return null;

} public Some Add(Some s1){return(this+s1);} 

}

//...

Dim s1 as new Some()Dim s2 as new Some()

Dim s3 as new Some()

S3 = s1.Add(s2) // s3 = Some.op_Addition(s1,s2)

//...

Page 14: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 14/20

Sử dụng toán tử  

 Nạp chồng toán tử có thể làm cho mã nguồn của chúng tatrực quan và những hành động của lớp mà chúng ta xâydựng giống như các lớp được xây dựng sẵn. 

Việc nạp chồng toán tử cũng có thể làm cho mã nguồn phức tạp một cách khó quản lý nếu chúng ta phá vỡ cáchthể hiện thông thường để sử dụng những toán tử. 

 Nạp chồng toán tử có tính chất đối xứng:  Khi ta định nghĩa toán tử == bắt buộc phải định nghĩa != 

Tương tự cho các cặp toán tử: > và <, <= và >= 

Lập trình Web  14

Page 15: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 15/20

Toán tử so sánh bằng 

Toán tử == và phương thức Equal được kế thừa từ Objectlà hoàn toàn khác nhau.

Khi định nghĩa toán tử == thì cũng nên định nghĩa lại phương thức Equal của lớp Object. 

Lập trình Web  15

public override bool Equals(object o)

{

if (!(o is PhanSo))

{return false;

}

return this == (PhanSo)o;

Page 16: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 16/20

Toán tử chuyển kiểu 

Toán tử chuyển kiểu dùng để chuyển một đối tượng từkiểu này sang kiểu khác. 

Cú pháp khai báo toán tử chuyển kiểu trong C#: 

typeName1 : Kiểu đích mà đối tượng sẽ được chuyển

thành. typeName2 : Kiểu nguồn. 

implicit

explicit

public + static + + operator + typeName1 + (typeName2)

Page 17: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 17/20

Từ khóa implicit cho biết việc chuyển kiểu có thể đượcthực hiện ngầm định bởi trình biên dịch. 

Từ khóa explicit cho biết việc chuyển kiểu chỉ được thựchiện một cách tường minh. 

Ví dụ: 

Toán tử chuyển kiểu 

Page 18: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 18/20

class Rational {// Constructs a Rational from an Int32

public Rational(Int32 numerator) { ... }// Converts a Rational to an Int32

public Int32 ToInt32() { … }

// Implicitly constructs and returns a Rational from an Int32public static implicit operator

Rational(Int32 numerator) {return new Rational(numerator);

}

// Explicitly returns an Int32 from a Rationalpublic static explicit operatorInt32(Rational r) { return r.ToInt32(); }

}

Page 19: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 19/20

Class App {

static void Main() {

// Implicit cast from Int32 to Rational

Rational r1 = 5;// Explicit cast from Rational to Int32

Int32 x = (Int32) r1;

}

}

Toán tử chuyển kiểu 

Page 20: 06 Nap Chong Toan Tu

7/27/2019 06 Nap Chong Toan Tu

http://slidepdf.com/reader/full/06-nap-chong-toan-tu 20/20

Bài tập 

1. Xây dựng lớp Phân số với các phép toán +,-,*,/,^, cáctoán tử so sánh và toán tử chuyển kiểu tường minh từ

 phân số sang số nguyên và ngầm định từ số nguyênsang phân số. 

2. Xây dựng lớp Vector trong không gian 2 chiều với các phép toán cộng, trừ, nhân, bằng, các toán tử so sánh... 

Lập trình Web  20