06 Nap Chong Toan Tu
-
Upload
nguyen-ngoc-lieu -
Category
Documents
-
view
221 -
download
0
Transcript of 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
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
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
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());
}
}
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ử?
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:
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
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
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
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
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
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ụ:
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)
//...
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
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;
}
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)
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
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(); }
}
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
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