Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 50

TÍNH CHẤT

HƯỚNG ĐỐI TƯỢNG


TRONG C#

1
I. NỀN TẢNG CỦA .NET:
I.1 Công nghệ Microsoft .NET:
- C# là một trong bốn ngôn ngữ chính thuộc bộ Visual Studio.NET của
hãng Microsoft (C#, VB.NET, C++.NET, J#.NET). Công nghệ
Microsoft.NET gồm hai thành phần chính:
Framework và IDE (Integrated Development Environment).
- IDE của Microsoft.NET cung cấp một môi trường, giúp chúng ta triển
khai một ứng dụng trên nền .NET một cách dễ dàng nhanh chóng. IDE
là công cụ lập trình trực quan (visual) dự trên nền Framework. Nếu
không có IDE, ta có thể dùng một chương trình soạn thảo văn bản như
Notepad để soạn thảo chương trình rồi dùng command line để biên
dịch và thực thi, tuy nhiên việc này mất nhiều thời gian.
- Framework của Microsoft là hạ tầng cơ bản được chuẩn hóa, độc lập
ngôn ngữ lập trình, cho phép xây dựng, biên dịch, chạy các dịch vụ
Web, XML hoặc các chương trình được viết bằng các ngôn ngữ hỗ
trợ .NET trên nền hệ điều hành có cài đặt .NET Framework.

2
I. NỀN TẢNG CỦA .NET:
I.2 Tổng quan về .NET Framework:
.NET Framework gồm hai thành phần chính là CLR và FCL.

CLR

CLR (Common Language Runtime) được xem như là máy ảo .NET (.NET
Virtual Machine). Nó là môi trường để thực thi, quản lý bộ nhớ, quản lý tiểu
trình cho các ứng dụng được hỗ trợ bởi .NET.
- Quản lý quá trình thực thi của chương trình: chọn trình biên dịch tương ứng
với ngôn ngữ lập trình. Biên dịch chương trình sang tập tin MSIL (Microsoft
Intermediate Language), biên dịch từ mã định dạng MSIL sang mã máy bằng
trình JIT (Just In Time), rồi sau đó CLR cung cấp cơ sở hạ tầng để thi hành
chương trình.
- Quản lý bộ nhớ: tự quản lý bộ nhớ là một trong những dịch vụ mà CLR cung
cấp trong quá trình thực thi chương trình. Trình thu gom rác (Garbage
Collector) quản lý bộ nhớ đã cấp phát cho một tiến trình rồi sau đó tự động thu
lại khi chương trình kết thúc.
3
I. NỀN TẢNG CỦA .NET:
I.2 Tổng quan về .NET Framework:
.NET Framework gồm hai thành phần chính là CLR và FCL.

FCL

FCL (Framework Class Library): là bộ thư viện có trên 5000 lớp thư viện, bao
gồm các lớp cơ sở, các lớp về dữ liệu và XML, các lớp dành cho dịch vụ web,
web form, windows form là cơ sở cho việc viết các ứng dụng Console,
Windows Form, ASP.net, XML Web, các dịch vụ Windows.

Ngoài ra, bộ Visual Studio .NET còn cung cấp:


- Một tập các server thương mại .NET cung cấp các chức năng
cho việc lưu trữ dữ liệu quan hệ, thư điện tử, thương mại điện tử,
các dịch vụ web.
- Hỗ trợ cho việc lập trình trên thiết bị không phải là PC như điện
thoại di động, thiết bị games.

4
Applications
Utilities
FCL
Bộ thư viện

CLR
Máy ảo .NET

Operating System

Visual Studio .NET


5
IDE
I. NỀN TẢNG CỦA .NET:
I.3 Ví dụ chương trình C# đơn giản:
.

Ví dụ 1:
using System;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World");
Console.ReadLine();
}
}
}

6
I. NỀN TẢNG CỦA .NET:
I.3 Ví dụ chương trình C# đơn giản:
class Program
Ví dụ .2: {
static void Main(string[] args)
class HOCSINH
{
{
HOCSINH hs = new HOCSINH();
private string hoten; hs.Nhap();
private int toan, van; hs.Xuat();
private float dtb; }
public void Nhap() }
{
Console.Write("Nhap ho ten: "); hoten = Console.ReadLine();
Console.Write("Nhap diem van: "); van = int.Parse(Console.ReadLine());
Console.Write("Nhap diem toan: "); toan = int.Parse(Console.ReadLine());
dtb = (float)(toan + van) / 2;
}
public void Xuat()
{
Console.WriteLine("Diem trung binh: {0:0.00}", dtb);
}
}
7
I. NỀN TẢNG CỦA .NET:
I.4 Không gian tên (Namespace):

- Khi làm việc với các dự án lớn, việc tổ chức mã


chương trình theo từng phần hay chức năng là điều cần
thiết.
- Mục đích sử dụng không gian tên trong C# là để nhóm
các lớp (class) có chức năng tương tự vào trong một
không gian tên nhằm tránh sự trùng lắp tên và phục vụ
cho nhu cầu sử dụng lại mã nguồn đã có.
- .NET Framework cung cấp nhiều không gian tên chứa
các class, các interface, các kiểu dữ liệu dùng chung cho
mọi ngôn ngữ lập trình hỗ trợ .NET. Tùy theo ứng dụng
đang viết mà ta tham chiếu đến các không gian tên cần
thiết.

8
I. NỀN TẢNG CỦA .NET:
I.4 Không gian tên (Namespace):
- Để sử dụng một không gian tên nào đó, ta dùng từ khóa using để khai báo nếu
không gian tên của lớp này khác với không gian tên của lớp sử dụng nó.
- Để khai báo không gian tên, ta sử dụng từ khóa namespace sau khi khai báo sử
dụng các không gian tên khác

Ví dụ:
using System.Data;
using System.Drawing;
using System.Text;
namespace MyNamespace
{
//khai báo các lớp (class) ở đây
}

9
I. NỀN TẢNG CỦA .NET:
I.5 C# có tính chất hướng đối tượng:

Tính chất hướng đối tượng của C# thể hiện qua các điểm sau:
- Sự đóng gói (Encapsulation).
- Kế thừa và đa hình (inheritance and polymorphism).
- Cho phép nạp chồng phương thức (overloading).
- Cho phép nạp chồng toán tử (operator).
- Cho phép tạo và thực thi giao diện (interface).
- Cho phép ủy quyền (deligate).

10
I. NỀN TẢNG CỦA .NET:
I.6 Lớp và đối tượng:

• Lớp đối tượng: Định nghĩa các thuộc tính (đặc điểm) và phương thức
(hành vi) chung cho tất cả các đối tượng của cùng một loại.
• Đối tượng: Thể hiện cụ thể của một lớp đối tượng.
• Ví dụ: Lớp SINHVIEN
- Thuộc tính: Họ tên, giới tính, ngày tháng năm sinh, điểm trung bình,
đối tượng ưu tiên, ...
- Phương thức: Học bài, làm bài thi, làm bài tập, ...

Sinh viên Nguyễn Văn A, Lý Thị B là đối tượng thuộc lớp SINHVIEN

11
I. NỀN TẢNG CỦA .NET:
I.6 Lớp và đối tượng:
class <Tên lớp>
{
<từ khóa truy xuất> thuộc tính;
<từ khóa truy xuất> phương thức();
}
• public: Truy xuất mọi nơi (phương thức thường sử dụng).
• protected: Truy xuất trong nội bộ lớp hoặc trong các lớp con, được
sử dụng cho lớp cơ sở (lớp cha)
• private (mặc định): Chỉ được truy xuất trong nội bộ lớp (thuộc tính
thường sử dụng).

12
I. NỀN TẢNG CỦA .NET:
I.6 Lớp và đối tượng:
Ví dụ:
class HOCSINH
{
private string hoten;
private int toan, van;
private float dtb;
public void Nhap()
{
// Cài đặt
}
public void Xuat()
{
//Cài đặt
}
}

13
I. NỀN TẢNG CỦA .NET:
I.6 Lớp và đối tượng:

• Tạo đối tượng:


<Tên lớp> tên đối tượng = new <Tên lớp> ();
Ví dụ: HOCSINH hs = new HOCSINH();

• Sử dụng đối tượng


tên đối tượng . tên phương thức của đối tượng ([tham số]);
Ví dụ: hs.Nhap();
hs.Xuat();

14
II. PHƯƠNG THỨC:
II.1 Mẫu khai báo phương thức:
Phương thức (method) có thể được xem như là một hàm hay một chương trình
con thuộc một lớp.

Mẫu khai báo phương thức:


[static] [AccessModifier] <Kiểu dữ liệu> TênPhươngThức([ds các tham số]);
Trong đó:
• Kiểu dữ liệu của phương thức (đầu ra hay kiểu của giá trị trả về), gồm 2 loại
– void: Không trả về giá trị
– float / int / long / string / kiểu cấu trúc / … : Trả về giá trị kết quả có kiểu
dữ liệu tương ứng với bài toán (chỉ trả về được 1 giá trị theo kiểu dữ liệu)

15
II. PHƯƠNG THỨC:
II.2 Phương thức Main:
Phương thức Main được xem như là một điểm vào (entry point)
Main của một chương trình viết bằng C#.

using System;
namespace MethodProject
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(“Hello C#”);
Console.ReadLine();
}
}
}

16
II. PHƯƠNG THỨC:
II.3 Phương thức static:
Phương thức static có thể được gọi trực tiếp thông qua tên lớp, còn
static phương thức không phải là static thì phải gọi gián tiếp thông qua một
đối tượng của lớp.
using System;
using System.Collections.Generic; namespace MethodProject
using System.Text; {
class Program
namespace MethodProject {
{ static void Main(string[] args)
class Class1 {
{ int kq;
public int a=0; kq=Class1.Nhan();
public int b=0; Console.WriteLine(“kq={0}”,ketqua);
public static float Nhan() }
{ }
return a*b; }
}
}
} 17
II. PHƯƠNG THỨC:
II.4 Khai báo chồng phương thức (Overload):
Các phương thức có thể có tên trùng nhau. Khi các phương
Overload thức trùng tên thuộc cùng một lớp thì các tham số của chúng
phải khác nhau về kiểu hoặc số lượng tham số

namespace LopDiemKyTu
{
class CToaDo
{
private int x, y;
public KhoiTao(int xx, int yy) {…}
public KhoiTao() {…}
public KhoiTao(CToaDo a) {…}
public KhoiTao(float xx, float yy) {…}
}
}

18
II. PHƯƠNG THỨC:
II.5 Từ khóa out, ref và params:
Từ khóa ref chỉ định tham số truyền vào phương thức dưới dạng
ref tham biến. Mọi sự thay đổi về gía trị của tham số bên trong phương
thức đều được giữ lại sau khi ra khỏi phương thức.
using System;
class Program
{
static void HoanVi(ref int a, ref int b)
{
int tam = a; a = b; b = tam;
Console.WriteLine("Trong HoanVi: a = " + a + ";b = " + b);
}
static void Main(string[] args)
{
int a = 5, b = 21;
Console.WriteLine("Truoc khi hoan vi: a = {0}; b = {1}", a, b);
HoanVi(ref a, ref b);
Console.WriteLine("Sau khi goi HoanVi: a = " + a + ";b = " + b);
}
19
}
II. PHƯƠNG THỨC:
II.5 Từ khóa out, ref và params:
Từ khóa out cũng dùng để chỉ định tham số được truyền vào phương
out thức dưới dạng tham biến. Nhưng có sự khác biệt với từ khóa ref, đó
là tham số truyền vào không cần khởi tạo trước đó.
using System;
class Program
{
static void HoanVi(out int a, out int b)
{ a = 5; b = 21;
Console.WriteLine("Truoc khi hoan vi: a = {0}; b = {1}", a, b);
int tam = a; a = b; b = tam;
Console.WriteLine("Trong HoanVi: a = " + a + ";b = " + b);
}
static void Main(string[] args)
{ int a, b;
HoanVi(out a, out b);
Console.WriteLine("Sau khi goi HoanVi: a = " + a + ";b = " + b);
}
} 20
II. PHƯƠNG THỨC:
II.5 Từ khóa out, ref và params:
Từ khóa params cho phép chỉ định tham số của phương thức là mảng tham
params số hoặc khi số lượng tham số quá nhiều. Sau từ khóa params, C# không cho
phép sử dụng thêm các từ khóa khác liên quan đến khai báo tham biến.

namespace ParamsKeywordProject
{
class Program
namespace ParamsKeywordProject {
{ static void Main(string[] args)
class Class1 {
{ Class1 a=new Class1();
public void WithParams(params int[] arr) int i = 10, j = 20, k = 30;
{…} cls.WithParams(i,j,k,40);
} int[] n=new int[] {20,30,50,
} 60};
cls.WithParams(a);
}
}
21
}
II. PHƯƠNG THỨC:
II.5 Delegate:
Delegate là một đối tượng tham chiếu đến một phương thức, bất kỳ
Delegate khi nào deligate được goi thì phương thức sẽ được tham chiếu
using System;
namespace DefineDelegateProject
{ class Program
{
delegate void MyDelegate(int i, int j); //khai báo deligate
static void Main(string[] args)
{ Console.WriteLine("instantiate Delegate");
MyDelegate del = new MyDelegate(Program.TotalValue);

del(10,20);
Console.ReadLine();
}
static void TotalValue(int a, int b)
{ int c = a + b;
Console.WriteLine("a+b={0}",c);
}
22
}
}
II. PHƯƠNG THỨC:
II.6 Constructor (phương thức thiết lập):
Là phương thức có tên trùng với tên lớp chứa nó. Các constructor
Constructor này sẽ tự động thực hiện khi đối tượng được sinh ra. Chúng thường
được dùng để khởi tạo dữ liệu ban đầu cho đối tượng.

Các phương thức thiết lập này có các đặc điểm sau:
- Không có giá trị trả về.
- Tên phương thức trùng với tên lớp.
- Có thể có hoặc không có tham số.
- Khi gọi sử dụng chúng, ta phải dùng từ khóa new

Mẫu phương thức:


class <Tên lớp>
{
//Thuộc tính
//Các phương thức
public <Tên lớp>([tham số]) {Gán giá trị cho thuộc tính}
}
23
II. PHƯƠNG THỨC:
II.6 Constructor (phương thức thiết lập):
Constructor Ví dụ:
class Program
{
class ViDu static void Main(string[] args)
{ private int a, b; {
public ViDu() ViDu vd = new ViDu();
{ a = 4; b = 2; } vd.Xuat();
public ViDu(int aa, int bb)
vd = new ViDu(1, 23);
{ a = aa; b = bb; }
public void Xuat() vd.Xuat();
{ }
Console.WriteLine("a = {0}, b = {1}", a, b); }
}
}

24
II. PHƯƠNG THỨC:
II.7 Destructor và Garbage Collector:
Destructor (phương thức hủy) được khai báo có cùng tên với tên
Destructor lớp chứa nó nhưng được thêm ký tự ‘~’ trước tên và không có
tham số với cú pháp như sau:

public class ClassName


{
public ClassName()
{ //code của constructor }

~ClassName()
{ //code của destructor }
}

Khi lớp có khai báo destructor thì chúng sẽ gọi tiến trình Garbage Collector
(GC) trong C#. Bằng cách gọi kỹ thuật này, hệ thống sẽ đánh dấu đối tượng
chứa destructor trong bộ nhớ sau đó hủy chúng
25
II. PHƯƠNG THỨC:
II.7 Destructor và Garbage Collector:
Kỹ thuật Garbage Collector giải phóng bộ nhớ của đối tượng
Garbage Collector đã chiếm đóng trong bộ nhớ rồi sau đó hủy chúng. GC thực
hiện theo những bước sau:

1) Đối tượng có khai báo destructor sẽ được thêm vào danh


sách đối tượng cần được tiêu hủy.
2) GC bắt đầu thực thi và kiểm tra trong bộ nhớ để tìm
những đối tượng không còn tham chiếu, nếu tìm thấy chúng
và chúng không tồn tại trong danh sách cần kết thúc
(Finallize) thì lập tức xóa chúng.
3) Trong trường hợp tìm thấy đối tượng trong danh sách
Finallize cần phải hoàn thành thì kỹ thuật này sẽ đánh dấu
sẵn sàng kết thúc chúng.
4) Khi chức năng GC hoàn thành, phương thức Finallize sẽ
được gọi cho những đối tượng đã đánh dấu sẵn sàng kết
thúc.
5) Kế đến, GC tiếp tục thực hiện chức năng của mình cho
lần kế tiếp.
26
II. PHƯƠNG THỨC:
II.8 Cài đặt phép toán (Operator):
Operator

• Giả sử khi ta thiết kế lớp phân số (CPHANSO) có phương thức cộng


(Cong), trừ (Tru), nhân (Nhan) và chia (Chia) 2 phân số. Khi đó, ta muốn
cộng 2 phân số a và b lưu vào phân số tổng c, ta phải viết là:
c = a.Cong(b);
Tương tự cho trường hợp nhân
c = a.Nhan(b);
• Cách này hơi gượng ép và không thể hiện hết ý nghĩa. Điều ta muốn viết
là:
c = a + b;
c = a * b;
Muốn làm được điều này, C# đã cung cấp cơ chế cài đặt phương thức
thông qua các ký hiệu phép toán (operator).

27
II. PHƯƠNG THỨC:
II.8 Cài đặt phép toán (Operator):
public static TênLớp operator Ký hiệu(TênLớp trái, TênLớp phải)
Ký hiệu: Gồm các ký hiệu phép toán số học,
logic và so sánh
Operator
Trái: Tên tham số sẽ nằm bên trái phép toán
Phải: Tên tham số sẽ nằm bên phải phép toán

Ví dụ: Giả sử có lớp phân số (CPHANSO)


public static CPHANSO operator + (CPHANSO ps1, CPHANSO ps2)
{
//Cài đặt
}
Giả sử có 2 phân số a, b và phân số tổng c. Yêu cầu thực hiện như sau:
c = a + b;

28
II. PHƯƠNG THỨC:
II.8 Cài đặt phép toán (Operator):
class CPHANSO
Operator {
private int tuso, mauso;
public CPHANSO(int t, int m)
{
tuso = t; mauso = m;
}
public static CPHANSO operator +(CPHANSO ps1, CPHANSO ps2)
{
int tu = ps1.tuso*ps2.mauso + ps2.tuso*ps1.mauso;
int mau = ps1.mauso*ps2.mauso;
CPHANSO c = new CPHANSO(tu, mau);
return c;
}
public void Xuat()
{
Console.WriteLine("{0}/{1}", tuso, mauso);
}
}
29
II. PHƯƠNG THỨC:
II.9 Nạp chồng phương thức WriteLine:
• Phương thức WriteLine() chỉ xuất những dữ liệu có kiểu cơ bản.
WriteLine Ví dụ:
int a = 4; float b = 7;
Console.WriteLine(“a={0}, b={1}”, a, b);
• Đối với đối tượng thì phương thức WriteLine() không thực hiện được
Giả sử có lớp phân số (CPHANSO):
CPHANSO ps = new CPHANSO(5, 3);
Console.WriteLine(“Phan so: “ + ps);
C# sẽ báo lỗi.
Để sử dụng được Console.WriteLine(“Phan so: “ + ps); cho đối tượng ps, ta phải
nạp chồng phương thức ToString() như sau:
public override string ToString()
{
string s=Tạo chuỗi cần xuất gồm các các thuộc tính của đối tượng;
return s;
} 30
II. PHƯƠNG THỨC:
II.9 Nạp chồng phương thức WriteLine:
class CPHANSO
{
private int tuso, mauso;
public CPHANSO(int t, int m)
{
static void Main(string[] args)
tuso = t;
{
mauso = m; CPHANSO a = new CPHANSO(3, 5);
} Console.WriteLine( a.ToString());
public override string ToString() }
{
string s = tuso.ToString() + "/" + mauso.ToString();
return s;
}
public void Xuat()
{
Console.WriteLine("{0}/{1}", tuso, mauso);
}
} 31
III. THUỘC TÍNH:
III.1 Xây dựng property:
Ví dụ: thực hiện truy xuất và gán dữ liệu như sau:

class ViDu
class Program
{
private int a, b; {
public void Nhap() static void Main(string[] args)
{ {

ViDu vd = new ViDu();
}
public void Xuat() vd.a = 5; // Lỗi
{ vd.b = 4; //Lỗi
… vd.Xuat();
} }
}
}

32
III. THUỘC TÍNH:
III.1 Xây dựng property:
C# cung cấp một hình thức khai báo gọi là property để thao tác trên
thuộc tính (gán và đọc dữ liệu) của đối tượng.
Cách định nghĩa property
Định nghĩa cho tất cả các thuộc tính cho lớp
public <kiểu thuộc tính> Tên property
{
get{return <tên thuộc tính>;}
set{<tên thuộc tính> = value;}
}

• get : Đọc thuộc tính


• set : Gán giá trị cho thuộc tính
• Tên property : Đặt tên bất kỳ theo quy ước đặt tên nhưng nên đặt dễ
nhớ (tốt nhất là trùng tên với tên thuộc tính và ghép thêm số phía
sau) 33
III. THUỘC TÍNH:
III.1 Xây dựng property:
class ViDu
{
private int a, b;
public void Nhap() {…} class Program
public void Xuat() {…}
{
public int A1
static void Main(string[] args)
{
get{return a;} {
set{a=value;} ViDu vd = new ViDu();
} vd.A1 = 5 + vd.B1;
public int B1 vd.Xuat();
{ }
get {return b;}
}
set { b = value; }
}
}
34
III. THUỘC TÍNH: (tương tự như xây dựng property
III.1 Xây dựng indexer: nhưng dành cho thuộc tính kiểu array)

namespace IndexerProject
{
class Class1
{ class Program
private int[] iArray = new int[10]; {
public int this[int index] static void Main(string[] args)
{ { Console.WriteLine("Indexer Property");
get TruyCap();
{ if (index < 0 || index > 10) Console.ReadLine();
return 0; }
else static void TruyCap()
return iArray[index]; { Class1 cls = new Class1();
} for (int i = 0; i < 10; i++)
set cls[i] = i * 100;
{ if (!(index < 0 || index > 10)) for (int i = 0; i < 10; i++)
iArray[index] = value; Console.WriteLine("Element #{0} = {1}", i, cls[i]);
} }
} }
}
} 35
III. KẾ THỪA:
III.1 Khái niệm kế thừa:
Kế thừa (inheritance) là khái niệm khai báo một lớp như là một con cháu
của một lớp khác. Lớp cho phép lớp khác kế thừa được gọi là lớp cơ sở
(base) lớp đang kế thừa lớp khác thì gọi là lớp dẫn xuất (derive). Nhờ sự
thừa kế mà lớp dẫn xuất có thể sử dụng lại những thuộc tính và phương
thức của lớp cơ sở.

A A
B
A: Là trường hợp tổng quát của B B C
B: Là trường hợp đặc biệt của A
A: Là trường hợp tổng quát của B và C
B, C: Là trường hợp đặc biệt của A

36
III. KẾ THỪA:
III.1 Khái niệm kế thừa:

CNGUOI

CHOCSINH CGIAOVIEN CVANPHONG CPHUHUYNH

37
III. KẾ THỪA:
III.1 Khái niệm kế thừa:
• Kế thừa từ các lớp có từ trước.
• Ích lợi: có thể tận dụng lại
– Các thuộc tính chung
– Các hàm có thao tác tương tự

Lớp cơ sở LỚP CHA


CSINHVIEN
(Base class) (Super class)

Lớp dẫn xuất LỚP CON


CSINHVIENCNTT
(Derived class) (Sub class)
38
III. KẾ THỪA:
III.2 Kế thừa bằng từ khóa new và base:

Dùng từ khóa new


class COSO
{
protected kiểu data1;
protected kiểu data2;
public void Method1() {…}
public void Method2() {…}
}
class DANXUAT : COSO
{
private kiểu data3;
public new void Method1() {…}
public new void Method2() {…}
}

39
III. KẾ THỪA:
III.2 Kế thừa bằng từ khóa new và base:
Ví dụ viết chương trình nhập xuất nhân viên, biết rằng gồm 2 loại nhân viên:
Nhân viên biên chế và nhân viên hợp đồng. Thông tin của nhân viên gồm: mã
số, Họ tên.
•Nhân viên biên chế có thông tin riêng là bậc lương.
•Nhân viên hợp đồng có thông tin riêng là số giờ làm.

Ta có cây kế thừa sau:

CNHANVIEN

CBIENCHE CHOPDONG

40
III. KẾ THỪA:
III.2 Kế thừa bằng từ khóa new và base:
class CNHANVIEN
{
protected int maso;
protected string hoten;
public CNHANVIEN()
{
maso = 0; hoten = "";
}
public void Nhap()
{
Console.Write("Nhap ma so nhan vien: ");
maso = int.Parse(Console.ReadLine());
Console.Write("Nhap ho ten nhan vien: ");
hoten = Console.ReadLine();
}
public void Xuat()
{
Console.WriteLine("Ma so: {0}\nHo ten: {1}", maso, hoten);
}
} 41
III. KẾ THỪA:
III.2 Kế thừa bằng từ khóa new và base:
class CBIENCHE : CNHANVIEN
{
private float hesoluong;
public CBIENCHE(): base()
{
hesoluong = 0;
}
public new void Nhap()
{
base.Nhap();
Console.Write("Nhap he so luong: ");
hesoluong = float.Parse(Console.ReadLine());
}
public new void Xuat()
{
base.Xuat();
Console.WriteLine("He so luong: " + hesoluong);
}
} 42
III. KẾ THỪA:
III.2 Kế thừa bằng từ khóa new và base:
class Program
class CHOPDONG : CNHANVIEN
{
{ static void Main(string[] args)
private float sogio; {
CBIENCHE nvbc = new CBIENCHE();
public CHOPDONG() : base()
nvbc.Nhap();
{ CHOPDONG nvhd = new CHOPDONG();
sogio = 0; nvhd.Nhap();
Console.WriteLine("\nNhan vien bien che");
}
nvbc.Xuat();
public new void Nhap() Console.WriteLine("\nNhan vien hop dong");
{ nvhd.Xuat();
}
base.Nhap();
}
Console.Write("Nhap so gio lam viec: ");
sogio = float.Parse(Console.ReadLine());
}
public new void Xuat()
{
base.Xuat();
Console.WriteLine("So gio lam viec: " + sogio);
}
} 43
III. KẾ THỪA:
III.2 Kế thừa bằng từ khóa virtual và overwrite:
class COSO
{
protected kiểu data1;
protected kiểu data2;
public virtual void Method1() {…}
public virtual void Method2() {…}
}
class DANXUAT : COSO
{
private kiểu data3;
public override void Method1() {…}
public override void Method2() {…}
}

44
IV. LỚP TRỪU TƯỢNG VÀ INTERFACE:
IV.1 Lớp trừu tượng (abstract class):
Lớp trừu tượng chỉ thiết lập một cơ sở cho các lớp kế thừa. Lớp
trừu tượng không thể có bất kỳ một thể hiện nào tồn tại. Phương
thức abstract trong lớp trừu tượng là phương thức chỉ có tên thôi
và nó phải được cài đặt lại ở tất các các lớp kế thừa.

abstract class COSO class DANXUAT : COSO


{ {
protected kiểu data1; private kiểu data3;
protected kiểu data2;
public override void Method1()
public abstract void
Method1(); {…}
public abstract void public override void Method2()
Method2(); {…}
}
}

45
IV. LỚP TRỪU TƯỢNG VÀ INTERFACE:
IV.1 Lớp trừu tượng (abstract class):
abstract class Window
{
protected int top, left;
public Window(int top, int left)
class ListBox : Window
{
{
this.top = top; this.left = left; private string listBoxContents;
} public ListBox(int top, int left, string
abstract public void DrawWindow( ); contents) :
} base(top, left)
{
listBoxContents = contents;
}
public override void DrawWindow( )
{
Console.WriteLine("Writing string to
the listbox: {0}",
listBoxContents);
}
}
46
IV. LỚP TRỪU TƯỢNG VÀ INTERFACE:
IV.2 Interface (giao diện):

- Interface thì tương tự như lớp trừu tượng, nhưng interface chỉ chứa
định nghĩa của các phương thức, property, delegate.
- Không cho phép chỉ định tầm vực khi định nghĩa các thành viên trong
Interface.
- Interface có thể kế thừa từ một hay nhiều Interface cơ sở khác.
- Một một lớp nào đó kế thừa Interface thì phải cài đặt phần thân cho tất
cả các thành viên đã khai báo trong Interface.
- C# cho phép một lớp dẫn xuất đa kế thừa nhiều Inteface.

Cú pháp để định nghĩa một giao diện như sau:


[thuộc tính] [Modifier] interface <têngiaodiện> [:danh sách cơ sở]
{
<phần thân giao diện>
}

47
IV. LỚP TRỪU TƯỢNG VÀ INTERFACE:
IV.2 Interface (giao diện):
Ví dụ: namespace InterfaceProject
{
interface IDatabases
{
string SQL
{
get;
set;
}
string Error
{
get;
}
DataTable GetDataTable();
int ExecuteSQL();
void ExecuteSQL(ref object value);
}
}
48
IV. LỚP TRỪU TƯỢNG VÀ INTERFACE:
IV.3 Từ khóa partial
- Đối với C# 2005 thì ta có thể khai báo một lớp, cấu trúc struct, hay Interface
trên nhiều tập tin bằng cách sử dụng từ khóa partial thay vì phải trân một tập tin
như ta thường làm trong các phiên bản trước.
- Mỗi tập tin chứa đựng toàn bộ hay một phần của lớp, khi biên dịch chúng sẽ
được kết hợp thành một. Điều này cho phép ta có thể phân chia lớp ra thành
nhiều phần, mỗi phần giao cho một nhóm lập trình viên thực hiện khi họ cùng
làm việc trên một dự án lớn.
trong tập tin Class1.cs
using System;
trong tập tin Class2.cs
namespace PartialClassProject
using System;
{
namespace PartialClassProject
partial class clsCommon
{
{
partial class clsCommon
int i = 10;
{
int j = 20;
public int multiple()
public int sum()
{
{
return i * j;
return i + j;
}
}
}
}
}
} 49
50

You might also like