Định nghĩa lớp dẫn xuấtĐịnh nghĩa phương thức khởi tạo gọi đến phương thức khởi tạo của lớp cơ sở Gọi đến phương thức hoặc thuộc tính của lớp cơ sở Ẩn phương thức non-virtual Ghi đè lên
Trang 1Bài 2:
Lập trình hướng đối tượng & Collection
Trang 2Giới thiệu về NET và Visual Studio
Giới thiệu về các kiến thức lập trình cơ bản trên ngôn
ngữ C#
Kiểu dữ liệu
Toán tử
Thao tác với chuỗi
Cấu trúc điều khiển
Phương thức
Xử lý ngoại lệ
Hệ thống bài cũ
Giới thiệu về NET và Visual Studio
Giới thiệu về các kiến thức lập trình cơ bản trên ngôn
ngữ C#
Kiểu dữ liệu
Toán tử
Thao tác với chuỗi
Cấu trúc điều khiển
Phương thức
Xử lý ngoại lệ
Trang 4LỚP, CẤU TRÚC VÀ
ĐỐI TƯỢNG LỚP, CẤU TRÚC VÀ
ĐỐI TƯỢNG
Trang 5Định nghĩa lớp
Tạo đối tượng từ lớp
Dim dtSanpham As Sanpham
dtSanpham = New Sanpham()
Sanpham dtSanpham ; dtSanpham = new Sanpham();
Trang 6Phương thức khởi tạo
Visual Basic
Khởi tạo không có tham số
Khởi tạo có tham số
C#
Khởi tạo không có tham số
Khởi tạo có tham số
End Sub
{ }
Khởi tạo không có tham số
Khởi tạo có tham số
Khởi tạo không có tham số
Khởi tạo có tham số
End Sub
{ }
Trang 7Định nghĩa các trường
và phương thức cho lớpVisual Basic
Định nghĩa trường
Định nghĩa phương thức
C#
End Function
{ }
Trang 8Điều khiển truy cập
Phạm vi public internal protected private
Trang 9Kế thừa
SanPham
string ma string ten decimal gia string hienThiThongTin()
Lớp cơ sở
Sach
string ma string ten decimal gia string hienThiThongTin() string tacgia
PhanMem
string ma string ten decimal gia string hienThiThongTin() string phienban
Trang 10Viết từ khóa virtual trước phương thức có thể sẽ được
ghi đè ở các lớp dẫn xuất
Tạo lớp cơ sở
public class SanPham
{
public string Ma { get ; set ; }
public string Ten { get ; set ; }
public decimal Gia { get ; set ; }
public SanPham( string ma, string ten, decimal gia) {
this Ma = ma;
this Ten = ten;
this Gia = gia;
}
public class SanPham
{
public string Ma { get ; set ; }
public string Ten { get ; set ; }
public decimal Gia { get ; set ; }
public SanPham( string ma, string ten, decimal gia) {
this Ma = ma;
this Ten = ten;
this Gia = gia;
}
Trang 11Định nghĩa lớp dẫn xuất
Định nghĩa phương thức khởi tạo gọi đến phương thức
khởi tạo của lớp cơ sở
Gọi đến phương thức hoặc thuộc tính của lớp cơ sở
Ẩn phương thức non-virtual
Ghi đè lên phương thức virtual
Tạo lớp dẫn xuất
public class TenLopDanXuat: TenLopCoSo
public TenLop (danhSachThamSo): base(danhSachThamSo)
Định nghĩa lớp dẫn xuất
Định nghĩa phương thức khởi tạo gọi đến phương thức
khởi tạo của lớp cơ sở
Gọi đến phương thức hoặc thuộc tính của lớp cơ sở
Trang 12Demo tạo lớp dẫn xuất
class Sach : SanPham
{
public string Tacgia { get ; set ; }
public Sach( string ma, string ten, string tacgia, decimal gia)
: base (ma, ten, gia) {
this Tacgia = tacgia;
public string Tacgia { get ; set ; }
public Sach( string ma, string ten, string tacgia, decimal gia)
: base (ma, ten, gia) {
this Tacgia = tacgia;
Trang 13Cách khác để ghi đè lên một phương thức
Demo tạo lớp dẫn xuất
public override string hienThiThongTin()
Trang 14Là tính năng quan trọng trong lập trình hướng đối tượngGiúp ứng dụng sẽ ứng xử khác nhau đối với các đối
tượng khác nhau kế thừa từ một lớp cơ sở
Thường được sử dụng khi không xác định được kiểu củađối tượng lúc chạy
Đa hình
Trang 15Demo sử dụng đa hình
Sach sach = new Sach( "S001", "Lap trinh Winform", "Joel Murach", 20);
PhanMem phanmem = new PhanMem( "PM001", "Kapersky", "2012", 30);
Sach sach = new Sach( "S001", "Lap trinh Winform", "Joel Murach", 20);
PhanMem phanmem = new PhanMem( "PM001", "Kapersky", "2012", 30);
Trang 16Cho phương thức hienThi như sau
Hãy đoán kết quả khi gọi phương thức hienThi như sau
Cho phương thức hienThi như sau
Hãy đoán kết quả khi gọi phương thức hienThi như sau
Sach sach = new Sach( "S001", "Lap trinh Winform", "Joel Murach", 20);
PhanMem phanmem = new PhanMem( "PM001", "Kapersky", "2012", 30);
hienThi(sach);
hienThi(phanmem);
Trang 17Dùng để định nghĩa kiểu biến giống như lớp nhưng kiểugiá trị
Các kiểu giá trị như int, decimal, DateTime…
Ưu điểm của cấu trúc
Tiết kiệm bộ nhớ
Khởi tạo nhanh hơn
tượng muốn lưu trữ kiểu giá trị
Các kiểu giá trị như int, decimal, DateTime…
Ưu điểm của cấu trúc
Tiết kiệm bộ nhớ
Khởi tạo nhanh hơn
tượng muốn lưu trữ kiểu giá trị
Cấu trúc giống lớp
Các trường, thuộc tính, phương thức, sự kiện và toán hạng Thành viên tĩnh và thành viên thực thể
Trang 18Hạn chế của cấu trúc so với lớp
Không hỗ trợ phương thức khởi tạo không có tham số
Không hỗ trợ kế thừa
Không hỗ trợ thuộc tính tự khởi tạo
Các thành viên chỉ được gọi khi được khởi tạo
Cấu trúc
Hạn chế của cấu trúc so với lớp
Không hỗ trợ phương thức khởi tạo không có tham số
Không hỗ trợ kế thừa
Không hỗ trợ thuộc tính tự khởi tạo
Các thành viên chỉ được gọi khi được khởi tạo
Trang 19Demo định nghĩa cấu trúc
public struct SanPham
{
public string Ma;
public string Ten;
public decimal Gia;
public SanPham( string ma, string ten, decimal gia) {
this Ma = ma;
this Ten = ten;
this Gia = gia;
public string Ma;
public string Ten;
public decimal Gia;
public SanPham( string ma, string ten, decimal gia) {
this Ma = ma;
this Ten = ten;
this Gia = gia;
Trang 20Khai báo và gán giá trị cho cấu trúc
Khởi tạo giá trị cho cấu trúc
Demo khai báo và khởi tạo cấu trúc
Khai báo và gán giá trị cho cấu trúc
Khởi tạo giá trị cho cấu trúc
SanPham sp2 = new SanPham ( "002", "SH", 120000000 );
Trang 21NAMESPACES NAMESPACES
Trang 22.NET 4.0 cung cấp rất nhiều lớp và cấu trúc cài đặt sẵn
Các lớp và cấu trúc này thuộc NET FrameWork
.NET 4.0 cung cấp rất nhiều lớp và cấu trúc cài đặt sẵn
Các lớp và cấu trúc này thuộc NET FrameWork
Trang 24Xem file NET35_Namespaces_Poster_LORES để biết
thêm về các lớp được các lớp được hỗ trợ bởi NET 3.5Xem file PDC2008-NETFX4 để biết thêm về các lớp mớiđược NET 4 hỗ trợ
Namespaces
Trang 25CẤU TRÚC DATETIME
& LỚP STRING CẤU TRÚC DATETIME
& LỚP STRING
Trang 26Thuộc namespace System
Cú pháp tạo đối tượng DateTime
Ví dụ
Cấu trúc DateTime
DateTime tenbien = new DateTime (nam, thang,
ngay [, gio, phut, giay [, miligiay]]);
//hoặc
DateTime tenbien = DateTime.Parse (string)
Thuộc namespace System
Cú pháp tạo đối tượng DateTime
Ví dụ
//1/30/2010 12:00 AM
DateTime date1 = new DateTime(10, 01, 30);
//1/30/2010 2:15 PM
Trang 27Thuộc tính của DateTime
Year Trả về năm của giá trị DateTime Hour Trả về giờ của giá trị DateTime Minute Trả về phút của giá trị DateTime Second Trả về giây của giá trị DateTime
DateTime thoiGianHienTai = DateTime.Now; //30/1/2010 10:26:35
DateTime ngayThangHienTai = DateTime.Today; //30/1/2010 12:00:00 AM
int thang = ngayThangHienTai.Day; //1
Trang 28Phương thức của DateTime
addDays(songay) Thêm số ngày vào giá trị kiểu DateTime và trả
về giá trị khác kiểu DateTime addMonths(sothang) Thêm số tháng vào giá trị kiểu DateTime và
trả về giá trị khác kiểu DateTime addYears(sonam) Thêm số năm vào giá trị kiểu DateTime và trả
về giá trị khác kiểu DateTime
Thêm số năm vào giá trị kiểu DateTime và trả
về giá trị khác kiểu DateTime DaysInMonth(nam, thang) Trả về số ngày có trong 1 tháng năm xác định
IsLeapYear(nam) Trả về giá trị Boolean cho biết năm được chỉ ra
có phải là năm nhuận hay không
Trang 29Thuộc namespace System
StartsWith(chuoi) Trả về giá trị boolean cho biết chuỗi đó có
được bắt đầu bằng chuỗi chỉ ra hay không EndsWith(chuoi) Trả về giá trị boolean cho biết chuỗi đó có
được kết thúc bằng chuỗi chỉ ra hay không IndexOf(chuoi) Trả về vị trí xuất hiện chuỗi đầu tiên
Insert(chisodau, chuoi) Thêm chuỗi được chỉ ra vào vị trí xác định
Trang 30Demo sử dụng String
string chars = "abcdefg";
char a = chars[0]; //'a'
char b = chars[1]; //'b'
bool isStartWith = chars.StartsWith( "abc"); //true
bool isEndWith = chars.EndsWith( "abc"); //false
string tenCongTy = "Mike Murach and Associates";
int index1 = tenCongTy.IndexOf( "Murach"); //5
int index2 = tenCongTy.LastIndexOf( " "); //15
string chars = "abcdefg";
char a = chars[0]; //'a'
char b = chars[1]; //'b'
bool isStartWith = chars.StartsWith( "abc"); //true
bool isEndWith = chars.EndsWith( "abc"); //false
string tenCongTy = "Mike Murach and Associates";
int index1 = tenCongTy.IndexOf( "Murach"); //5
int index2 = tenCongTy.LastIndexOf( " "); //15
Trang 31MẢNG VÀ
COLLECTION
Trang 32Cú pháp khai báo mảng một chiều
int[] diem = new int[10];
//khai báo và khởi tạo giá trị cho mảng
int[] diem3 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] diem;
diem = new int[10];
//hoặc
int[] diem = new int[10];
//khai báo và khởi tạo giá trị cho mảng
int[] diem3 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Trang 33Kiểu giá trị Giá trị mặc định
Trang 34Lấy độ dài của mảng
Truy cập đến phần tử của mảng
Gán giá trị cho các phần tử của mảng
Duyệt qua các phần tử của mảng
Thao tác với mảng
int tong = diem[0] + diem[1] + diem[2];
int dodai = diem.Length
Lấy độ dài của mảng
Truy cập đến phần tử của mảng
Gán giá trị cho các phần tử của mảng
Duyệt qua các phần tử của mảng
diem[0] = 9;
int tong = 0;
for (int i = 0; i < diem.Length; i++)
Trang 35Khai báo mảng hai chiều
Gán giá trị cho các phần tử
Mảng hai chiều
kieu[,] tenMang = new kieu[hang, cot]
//ví dụ:
int[,] diem = new int [3, 2];
//khai báo và khởi tạo giá trị cho mảng
Trang 36Mỗi mảng là một thể hiện của lớp Array
Lớp Array chứa các thuộc tính và phương thức để thaotác với lớp
Lớp Array
Length Cho biết số phần tử của element
Phương thức thực thể Mô tả
GetLength(chieu) Cho biết số phần tử của chiều được chỉ ra
GetUpperBound(chieu) Cho biết chỉ số của phần tử cuối cùng của
chiều được chỉ ra
Trang 38Các lớp collection không định kiểu được lưu trữ trong
namespace System.Collections
Lưu trữ các kiểu khác nhau trong một collection
Các đối tượng khi lưu vào collection không định kiểu được
tự động chuyển thành kiểu Object (boxing)
Khi lấy dữ liệu ra khỏi collection cần phải ép dữ liệu về
đúng kiểu ban đầu (unboxing)
Nhược điểm:
Cần phải ép về kiểu ban đầu
Thường gặp lỗi xẩy ra khi ép kiểu sai
Collection không định kiểu
Các lớp collection không định kiểu được lưu trữ trong
namespace System.Collections
Lưu trữ các kiểu khác nhau trong một collection
Các đối tượng khi lưu vào collection không định kiểu được
tự động chuyển thành kiểu Object (boxing)
Khi lấy dữ liệu ra khỏi collection cần phải ép dữ liệu về
đúng kiểu ban đầu (unboxing)
Nhược điểm:
Cần phải ép về kiểu ban đầu
Thường gặp lỗi xẩy ra khi ép kiểu sai
Trang 39Boxing và Unboxing
Trang 40Demo sử dụng collection không định kiểu
ArrayList numbers = new ArrayList();
Trang 41Các lớp collection định kiểu được lưu trữ trong
namespace System.Collections.Generic
Lưu trữ cùng một kiểu dữ liệu trong một Collection
Collection định kiểu
Dictionary<TKey, TValue> Lưu trữ collection gồm cặp khóa và giá trị
HashSet<T> Lưu trữ tập các giá trị
Các lớp collection định kiểu được lưu trữ trong
namespace System.Collections.Generic
Lưu trữ cùng một kiểu dữ liệu trong một Collection
HashSet<T> Lưu trữ tập các giá trị
LinkedList<T> Lưu trữ danh sách liên kết đôi
List<T> Lưu trữ mảng các đối tượng
Queue<T> Lưu trữ hàng đợi “Vào trước, ra trước”
SortedSet<T> Lưu trữ tập các giá trị được sắp xếp
Stack<T> Lưu trữ đối tượng theo “Vào sau, ra trước”
Tìm hiểu thêm về các collection và cách sử dụng chúng trên trang
Trang 42Demo sử dụng collection định kiểu
List<int> numbers = new List<int>();
Trang 43TỰ SINH MÃ
KHAI BÁO
TỰ SINH MÃ
KHAI BÁO
Trang 44Tự sinh mã là tính năng mới của Visual Studio 2010
Tính năng này sẽ tự sinh mã khai báo cho bạn khi cần
thiết
Bạn khai báo một đối tượng của lớp chưa định nghĩa
Tính năng này sẽ tự động sinh mã định nghĩa lớp cho bạn
Bạn gọi một phương thức chưa được định nghĩa
Tính năng này sẽ định nghĩa phương thức cho bạn
Tự sinh mã khai báo (generate code stubs)
Tự sinh mã là tính năng mới của Visual Studio 2010
Tính năng này sẽ tự sinh mã khai báo cho bạn khi cần
thiết
Bạn khai báo một đối tượng của lớp chưa định nghĩa
Tính năng này sẽ tự động sinh mã định nghĩa lớp cho bạn
Bạn gọi một phương thức chưa được định nghĩa
Tính năng này sẽ định nghĩa phương thức cho bạn
Trang 45Khai báo đối tượng thuộc lớp KhachHang chưa được
định nghĩa
Demo sử dụng tính năng tự sinh mã khai báo
Trang 46Gọi đến phương thức hienThiThongTin chưa được
định nghĩa
Demo sử dụng tính năng tự sinh mã khai báo
Trang 47Gọi đến phương thức hienThiThongTin chưa được
định nghĩa với hai đối số name và age
Demo sử dụng tính năng tự sinh mã khai báo
Thêm một phương thức
hienThiThongTin
Trang 48Các khái niệm về lập trình hướng đối tượng và collectiontrong C# giống hệt như trong Visual Basic, chỉ khác
nhau về cú pháp
Đối với kế thừa
Trong lớp cơ sở viết từ khóa virtual trước phương thức sẽ được ghi đè
Trong lớp dẫn xuất viết từ khóa override trước phương
thức sẽ được ghi đè
Đa hình là tính năng quan trọng trong lập trình hướng
đối tượng giúp ứng dụng sẽ ứng xử khác nhau đối với
các đối tượng khác nhau kế thừa từ một lớp cơ sở
Tổng kết bài học
Các khái niệm về lập trình hướng đối tượng và collectiontrong C# giống hệt như trong Visual Basic, chỉ khác
nhau về cú pháp
Đối với kế thừa
Trong lớp cơ sở viết từ khóa virtual trước phương thức sẽ được ghi đè
Trong lớp dẫn xuất viết từ khóa override trước phương
thức sẽ được ghi đè
Đa hình là tính năng quan trọng trong lập trình hướng
đối tượng giúp ứng dụng sẽ ứng xử khác nhau đối với
các đối tượng khác nhau kế thừa từ một lớp cơ sở
Trang 49Collection được phân làm hai loại Collection định kiểu vàkhông định kiểu
Collection không định kiểu có thể lưu nhiều loại đối
tượng và collection, nhưng khi lưu sẽ chuyển các đối
tượng này về kiểu Object (boxing)
Collection định kiểu chỉ lưu một kiểu đã được định nghĩatrước vào collection
Visual Studio 2010 cung cấp tính năng tự sinh mã khai
báo khi các biến hoặc phương thức được gọi chưa đượckhai báo trước đó
Tổng kết bài học
Collection được phân làm hai loại Collection định kiểu vàkhông định kiểu
Collection không định kiểu có thể lưu nhiều loại đối
tượng và collection, nhưng khi lưu sẽ chuyển các đối
tượng này về kiểu Object (boxing)
Collection định kiểu chỉ lưu một kiểu đã được định nghĩatrước vào collection
Visual Studio 2010 cung cấp tính năng tự sinh mã khai
báo khi các biến hoặc phương thức được gọi chưa đượckhai báo trước đó