





Preview text:
lOMoARcPSD| 61814229
Tính đóng gói (Encapsulation): Tính chất này không cho phép người dùng trực tiếp tác động đến dữ liệu bên
trong đối tượng mà phải thông qua các phương thức mà đối tượng cung cấp. Tính chất này đảm bảo tính toàn vẹn của đối tượng. class mayvitinh { private: string mausac; int chieudai, chieurong; public: void input() {
cout << "Nhap mau sac may: "; fflush(stdin); getline(cin,
this->mausac); cout << "Nhap
chieu dai may: "; cin >>
this->chieudai; cout << "Nhap
chieu rong may: "; cin >> this->chieurong; } void output() {
cout << "Mau sac may: " << this->mausac << endl;
cout << "Chieu dai may: " << this->chieudai << endl;
cout << "Chieu rong may: " << this->chieurong << endl; } };
tính đóng gói được thể hiện qua các thuộc tính mausac, chieudai, chieurong và phương thức input(), output() vào trong class mayvitinh.
Tính kế thừa (Inheritance): Kế thừa, tái sử dụng phương thức, thuộc tính của lớp cơ sở và lớp kế thừa được
gọi là lớp con, nó sẽ thừa hưởng những gì lớp cha có và cho phép.
ví dụ là class mayvitinh, class này sẽ có các thuộc tính: mausac, chieudai, chieurong. Một class mayAsus,
mayAcer sẽ kế thừa class mayvitinh do mayAsus cũng có các thuộc tính: mausac, chieudai, chieurong. Thay
vì sao chép những thuộc tính này, ta nên đặt chúng vào một lớp chung gọi là lớp cha – trong trường hợp này là
mayvitinh và có những lớp con mayAsus, mayAcer kế thừa từ nó, tạo ra một mối quan hệ cha/con.
Tính đa hình (Polymorphism): Tính đa hình cho phép các chức năng (method) khác nhau được thực thi khác
nhau trên các đối tượng khác nhau. lOMoARcPSD| 61814229
mỗi một dòng máy đều kế thừa từ lớp cha mayvitinh nhưng được chạy với một hệ điều hành khác nhau,
mayAsus thì được chạy với hệ điều hành Windows, còn mayMacbook sẽ được chạy với hệ diều hành MacOs.
Tính trừu tượng(Abstraction): Tập trung vào cốt lõi của đối tượng, bỏ qua những thứ không liên quan và không quan trọng.
Ví dụ: Bài toán quản lý sinh viên chúng ta chỉ cần quản lý các thông tin như o Họ tên o Ngày sinh o Giới tính o …
mà lại không cần quản lý thêm các thông tin: o Cân nặng o Màu da o Chiều cao
Tại vì chúng thực sự không cần thiết. Interface là gì?
Interface gần như là một lớp (class). Nó chỉ có những phương thức và thuộc tính trừu tượng. Một interface được
hiểu như là 1 khuôn mẫu mà mọi lớp thực thi nó đều phải tuân theo. Interface là một kỹ thuật giúp thu được tính
trừu tượng hoàn toàn và đa kế thừa trong lập trình C#. Interface nó chỉ định nghĩa các hành động, khả năng cần thiết ví dụ như: •
Khả năng bay: cần các hành động hỗ trợ như cất cánh, bay, hạ cánh. •
Khả năng đọc file: đọc header file, đọc dữ liệu, giải nén file. •
Khả năng kết nối: cần mở kết nối, gửi nhận dữ liệu, xác nhận kết nối, đóng kết nối. Đặc điểm, tính chất. •
Một interface có thể kế thừa nhiều interface khác nhưng nó không thể kế thừa bất kỳ lớp nào. •
Chỉ chứa khai báo không chứa phần định nghĩa (giống với phương thức thuần ảo). Mặc dù giống
phương thức thuần ảo nhưng bạn không cần phải khai báo từ khoá abstract. •
Việc ghi đè 1 thành phần ở trong interface cũng không cần từ khoá override. •
Không thể khai báo phạm vi truy cập cho các thành phần bên trong interface. Các thành phần này sẽ mặc định là public. •
Interface không chứa các thuộc tính (các biến) dù là hằng số hay là biến tĩnh cũng không được. •
Interface không có constructor và cũng không có destructor. •
Các lớp có thể thực thi nhiều interface cùng lúc. •
Một class thì người dùng implement được nhiều interface
Không phải là một đối tượng. lOMoARcPSD| 61814229 Mục đích: •
Việc sử dụng interface giúp định nghĩa về sự tương tác giữa người sử dụng và phần mềm. •
Interface được sử dụng như giao diện với bên ngoài được các abstract class hỗ trợ. Sản phẩm này
sinh ra để phục vụ cho sự tương tác này một cách tốt hơn. •
Một abstract class sử dụng để thực thi một interface. Do đó, các phương thức người dùng sẽ khai bảo
bởi interface phải hiển thị trong cùng lớp để quá trình biên dịch được hiệu quả. •
Dù thực thi được nhiều giao diện khi dùng như 1 lớp interface chỉ kế thừa được từ 1 lớp khác.
Anh(chị) cho biết các đặc điểm của Contrustor và cho ví dụ minh họa bằng code C#, ví dụ về việc kế thừa
Constructor ở lớp con (Derived class)
– Khi chúng ta tạo một đối tượng từ lớp con thì hàm dựng Constructor của lớp cha sẽ được gọi trước, được
thực hiện trước, sau đó thì hàm dựng Constructor của lớp con mới được gọi thực thi (Nôm na là phải có cha rồi
mới có con, nên hàm của cha sẽ được thực hiện trước) Vd: using System; namespace ciel { class Program {
static void Main(string[] args) { // ①
Tạo đối tượng hình chữ nhật
HinhChuNhat hcn = new HinhChuNhat();
// Sử dụng phương thức kế thừa từ lớp cha hcn.setChieuRong(8); hcn.setChieuDai(9);
// In Chu vi và Diện tích của hình chữ nhật
Console.WriteLine("Chu vi hinh chu nhat: {0}", hcn.TinhChuVi());
Console.WriteLine("Dien tich hinh chu nhat: {0}", hcn.TinhDienTich()); // ②
Tạo đối tượng hình vuông
HinhVuong hv = new HinhVuong();
// Sử dụng phương thức kế thừa từ lớp cha hv.setChieuDai(19); lOMoARcPSD| 61814229
// In Chu vi và Diện tích của hình vuông
Console.WriteLine("Chu vi hinh vuong: {0}", hv.TinhChuVi());
Console.WriteLine("Dien tich hinh vuong: {0}", hv.TinhDienTich()); Console.ReadKey(); } } ///
/// Class cơ sở Hình Học /// class HinhHoc { // Thuộc tính dùng chung protected int ChieuDai; protected int ChieuRong;
// Phương thức dùng chung
public void setChieuDai(int inChieuDai) { ChieuDai = inChieuDai; }
public void setChieuRong(int inChieuRong) { ChieuRong = inChieuRong; } } ///
/// Class dẫn xuất Hình Chữ Nhật ///
class HinhChuNhat : HinhHoc // Kế thừa lOMoARcPSD| 61814229 { public int TinhChuVi() {
// Sử dụng thuộc tính ChieuDai, ChieuRong kế thừa từ lớp cha
return (ChieuDai + ChieuRong) * 2; } public int TinhDienTich() {
return (ChieuDai * ChieuRong); } } ///
/// Class dẫn xuất Hình Vuông ///
class HinhVuong : HinhHoc // Kế thừa { public int TinhChuVi() {
// Sử dụng thuộc tính ChieuDai kế thừa từ lớp cha return (ChieuDai * 4); } public int TinhDienTich() {
return (int)Math.Pow(ChieuDai, 2); } } }
Sự khác nhau giữa truyền tham chiếu và tham trị:
Giống nhau: đều truyền giá trị vào hàm khi hàm được gọi Khác
nhau: o Truyền tham trị: truyền giá trị của biến vào hàm. o Truyền tham
chiếu: truyền địa chỉ của biến vào hàm lOMoARcPSD| 61814229 Tim so lon nhat: using System;
using System.Collections.Generic; using System.Linq;
using System.Security.Cryptography; using
System.Text; using System.Threading.Tasks; namespace TimIndexSoLonNhat { internal class Program {
static int imax; //khai báo biến max thuộc Class (chứ ko phải thuộc đối tượng) static void Main(string[] args) {
int[] lsInt = { 1, 2, 6, 3, 7, 9, 5, 3, 9 };
imax = MaximumOfArray(lsInt); //Tìm số lớn nhất trước
Console.WriteLine("Tim duoc so lon nhat " + imax.ToString());
List lsIndex = GetAllMaximumNumbers(lsInt); //Tìm danh sách các index của số lớn nhất
Console.WriteLine("Input"); foreach(int i in lsInt) { Console.WriteLine(i); }
Console.WriteLine("Danh sach index cua so lon nhat trong mang: "); foreach (int j in lsIndex) { Console.WriteLine(j); } }
static int MaximumOfArray(int[] myarr) { int tmpMax = myarr[0];
for (int i = 0; i < myarr.Length; i++) {
tmpMax = Math.Max(tmpMax, myarr[i]); //hàm Math.Max(a,b) trả về số lớn hơn trong 2 số a,b //if (myarr[i] > tmpMax) // tmpMax = myarr[i]; } return tmpMax; }
static List GetAllMaximumNumbers(int[] myarr) { //your code here
List dsidxmax = new List();//khởi tạo List các số nguyên
// chú ý phải dùng hàm new List()
for (int j = 0; j < myarr.Length; j++) { if (myarr[j] == imax)
{ //kiểm tra coi số đang xét có = imax không
// thêm vào ds địa chỉ max
//Console.WriteLine(j + " " + myarr[j].ToString()); dsidxmax.Add(j);
//dsidxmax.ForEach(x=>Console.Write("{0}\t", x)); } } return dsidxmax; } }