Giáo trình hướng dẫn tạo ra những kiểu dữ liệu mới bằng việc tạo ra các lớp đối tượng theo phương thức đa hình p9 pptx

5 322 0
Giáo trình hướng dẫn tạo ra những kiểu dữ liệu mới bằng việc tạo ra các lớp đối tượng theo phương thức đa hình p9 pptx

Đang tải... (xem toàn văn)

Thông tin tài liệu

Ngôn Ngữ Lập Trình C# Hai câu lệnh tiếp theo cộng một giá trị nguyên vào phân số f3 và gán kết quả mới về cho phân số mới f4: Fraction f4 = f3 + 5; Console.WriteLine(“f3 + 5 = f4: {0}”, f4.ToString()); Kết quả được trình bày theo thứ tự sau: In implicit conversion to Fraction In Fraction Construction(int) In operator+ In Fraction Constructor(int, int) f3 + 5 = f4: 25/4 Ghi chú: rằng toán tử chuyển đổi ngầm định được gọi khi chuyển 5 thành một phân số. Phân số được tạo ra từ toán tử chuyển đổi ngầm định này gọi phương thức khởi dựng một tham số để tạo phân số mới 5/1. Phân số mới này sẽ được chuyển thành toán hạng trong phép cộng với phân số f3 và kết quả trả về là phân số f4 là tổng của hai phân số trên. Thử nghiệm cuối cùng là tạo một phân số mới f5, rồi sau đó gọi toán tử nạp chồng so sánh bằng để kiểm tra xem hai phân số có bằng nhau hay không. Câu hỏi và trả lời Câu hỏi 1: Có phải khi xây dựng các lớp chúng ta chỉ cần dùng nạp chồng toán tử với các chức năng tính toán ? Trả lời 1: Đúng là như vậy, việc thực hiện nạp chồng toán tử rất tự nhiên và trực quan. Tuy nhiên một số ngôn ngữ .NET như VB.NET không hỗ trợ việc nạp chồng toán tử nên, tốt nhất nếu muốn cho lớp trong C# của chúng ta có thể được gọi từ ngôn ngữ khác không hỗ trợ nạp chồng toán tử thì nên xây dựng các phương thức tương đương để thực hiện cùng chức năng như: Add, Sub, Mul, Câu hỏi 2: Những điều lưu ý nào khi sử dụng nạp chồng toán tử trong một lớp? Trả lời 2: Nói chung là khi nào thật cần thiết và ít gây ra sự nhầm lẫn. Ví dụ như ta xây dựng lớp Employee có nhiều thuộc tính số như lương, thâm niên, tuổi Chúng ta muốn xây dựng toán tử ++ cho lương nhưng có thể làm nhầm lẫn với việc tăng số năm công tác, hay tăng tuổi. Do vậy việc sử dụng nạp chồng toán tử cũng phải cân nhắc tránh gây nhầm lẫn. Tốt nhất là sử dụng trong lớp có ít thuộc tính số Câu hỏi 3: Khi xây dựng toán tử so sánh thì có phải chỉ cần dùng toán tử so sánh bằng? Trả lời 3: Đúng là nếu cần dùng toán tử so sánh nào thì chúng ta có thể chỉ tạo ra duy nhất toán tử so sánh đó mà thôi. Tuy nhiên, tốt hơn là chúng ta cũng nên xây dựng thêm toán tử so sánh khác như: so sánh khác, so sánh nhỏ hơn, so sánh lớn hơn Việc này sẽ làm cho lớp của chúng ta hoàn thiện hơn. Câu hỏi thêm Nạp Chồng Toán Tử 163 Ngôn Ngữ Lập Trình C# Câu hỏi 1: Khi nào sử dụng toán tử chuyển đổi? Thế nào là chuyển đổi tường minh và chuyển đổi ngầm định? Câu hỏi 2: Có thể tạo ra ký hiện toán tử riêng của ta và thực thi nạp chồng toán tử đó hay không? Câu hỏi 3: Có bao nhiêu toán tử mà .NET quy định? Ký hiệu của từng toán tử? Bài tập Bài tập 1: Hãy tiếp tục phát triển lớp Fraction trong ví dụ của chương bằng cách thêm các toán tử khác như trừ, nhân, chia, so sánh Bài tập 2: Xây dựng lớp điểm trong không gian hai chiều, với các toán tử cộng, trừ, nhân, chia. Bài tập 3: Tương tự như bài tập 2 nhưng điểm nằm trong không gian 3 chiều. Bài tập 4: Xây dựng lớp số phúc (số ảo) với các phép toán cộng, trừ, nhân, chia. Nạp Chồng Toán Tử 164 Ngôn Ngữ Lập Trình C# Chương 7 CẤU TRÚC  Định nghĩa một cấu trúc  Tạo cấu trúc  Cấu trúc là một kiểu giá trị  Gọi bộ khởi dựng mặc định  Tạo cấu trúc không gọi new  Câu hỏi & bài tập Cấu trúc là kiểu dữ liệu đơn giản do người dùng định nghĩa, kích thước nhỏ dùng để thay thế cho lớp. Những cấu trúc thì tương tự như lớp cũng chứa các phương thức, những thuộc tính, các trường, các toán tử, các kiểu dữ liệu lồng bên trong và bộ chỉ mục (indexer). Có một số sự khác nhau quan trọng giữa những lớp và cấu trúc. Ví dụ, cấu trúc thì không hỗ trợ kế thừa và bộ hủy giống như kiểu lớp. Một điều quan trọng nhất là trong khi lớp là kiểu dữ liệu tham chiếu, thì cấu trúc là kiểu dữ lịêu giá trị (Chương 3 đã thảo luận về kiểu dữ liệu tham chiếu và kiểu dữ liệu giá trị). Do đó cấu trúc thường dùng để thể hiển các đối tượng không đòi hỏi một ngữ nghĩa tham chiếu, hay một lớp nhỏ mà khi đặt vào trong stack thì có lợi hơn là đặt trong bộ nhớ heap. Một sự nhận xét được rút ra là chúng ta chỉ nên sử dụng những cấu trúc chỉ với những kiểu dữ liệu nhỏ, và những hành vi hay thuộc tính của nó giống như các kiểu dữ liệu được xây dựng sẵn. Cấu trúc có hiệu quả khi chúng ta sử dụng chúng trong mảng bộ nhớ (Chương 9). Tuy nhiên, cấu trúc sẽ kém hiệu quả khi chúng ta sử dụng dạng tập hợp (collections). Tập hợp được xây dựng hướng tới các kiểu dữ liệu tham chiếu. Trong chương này chúng ta sẽ tìm hiểu các định nghĩa và làm việc với kiểu cấu trúc và cách sử dụng bộ khởi dựng để khởi tạo những giá trị của cấu trúc. Định nghĩa một cấu trúc Cú pháp để khai báo một cấu trúc cũng tương tự như cách khai báo một lớp: [thuộc tính] [bổ sung truy cập] struct <tên cấu trúc> [: danh sách giao diện] { [thành viên của cấu trúc] Cấu Trúc 165 Ngôn Ngữ Lập Trình C# } Ví dụ 7.1 sau minh họa cách tạo một cấu trúc. Kiểu Location thể hiện một điểm trong không gian hai chiều. Lưu ý rằng cấu trúc Location này được khai báo chính xác như khi thực hiện khai báo với một lớp, ngoại trừ việc sử dụng từ khóa struct. Ngoài ra cũng lưu ý rằng hàm khởi dựng của Location lấy hai số nguyên và gán những giá trị của chúng cho các biến thành viên, x và y. Tọa độ x và y của Location được khai báo như là thuộc tính.  Ví dụ 7.1 Tạo một cấu trúc. using System; public struct Location { public Location( int xCoordinate, int yCoordinate) { xVal = xCoordinate; yVal = yCoordinate; } public int x { get { return xVal; } set { xVal = value; } } public int y { get { return yVal; } set { yVal = value; } } Cấu Trúc 166 Ngôn Ngữ Lập Trình C# public override string ToString() { return (String.Format(“{0}, {1}”, xVal, yVal)); } // thuộc tính private lưu toạ độ x, y private int xVal; private int yVal; } public class Tester { public void myFunc( Location loc) { loc.x = 50; loc.y = 100; Console.WriteLine(“Loc1 location: {0}”, loc); } static void Main() { Location loc1 = new Location( 200, 300); Console.WriteLine(“Loc1 location: {0}”, loc1); Tester t = new Tester(); t.myFunc( loc1 ); Console.WriteLine(“Loc1 location: {0}”, loc1); } } Không giống như những lớp, cấu trúc không hỗ trợ việc thừa kế. Chúng được thừa kế ngầm định từ lớp object (tương tự như tất cả các kiểu dữ liệu trong C#, bao gồm các kiểu dữ liệu xây dựng sẵn) nhưng không thể kế thừa từ các lớp khác hay cấu trúc khác. Cấu trúc cũng được ngầm định là sealed, điều này có ý nghĩa là không có lớp nào hay bất cứ cấu trúc nào có thể dẫn xuất từ nó. Tuy nhiên, cũng giống như các lớp, cấu trúc có thể thực thi nhiều giao diện. Sau đây là một số sự khác nhau nữa là:  Không có bộ hủy và bộ khởi tạo mặc định tùy chọn: Những cấu trúc không có bộ hủy và cũng không có bộ khởi tạo mặc định không tham số tùy chọn. Nếu chúng ta không cung cấp bất cứ bộ khởi tạo nào thì cấu trúc sẽ được cung cấp một bộ khởi tạo mặc định, khi đó giá trị 0 sẽ được thiết lập cho tất cả các dữ liệu thành viên hay những giá trị mặc định tương ứng cho từng kiểu dữ liệu (bảng 4.2). Nếu chúng ta cung cấp bất cứ bộ khởi dựng nào thì chúng ta phải khởi tạo tất cả các trường trong cấu trúc. Cấu Trúc 167 . giống như kiểu lớp. Một điều quan trọng nhất là trong khi lớp là kiểu dữ liệu tham chiếu, thì cấu trúc là kiểu dữ lịêu giá trị (Chương 3 đã thảo luận về kiểu dữ liệu tham chiếu và kiểu dữ liệu giá. lớp cũng chứa các phương thức, những thuộc tính, các trường, các toán tử, các kiểu dữ liệu lồng bên trong và bộ chỉ mục (indexer). Có một số sự khác nhau quan trọng giữa những lớp và cấu trúc Không giống như những lớp, cấu trúc không hỗ trợ việc thừa kế. Chúng được thừa kế ngầm định từ lớp object (tương tự như tất cả các kiểu dữ liệu trong C#, bao gồm các kiểu dữ liệu xây dựng sẵn)

Ngày đăng: 26/07/2014, 04:22

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan