Tải bản đầy đủ (.pdf) (74 trang)

Bài giảng Chương 4: Kế thừa và đa hình - ThS. Phạm Thanh An

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.36 MB, 74 trang )

Chương 4: Kế thừa và Đa hình
(Inheritance and Polymorphism )
ThS. Phạm Thanh An

Khoa công nghệ thông tin
Đại học Ngân hàng Tp. Hồ Chí Minh


Nội dung trình bày






Đặc biệt hóa và tổng qt hóa.
Quan hệ kế thừa.
Đa hình.
Lớp trừu tượng.
Các lớp lồng nhau.


Mục tiêu
 Tìm

hiểu mối quan hệ giữa các đối
tượng trong thế giới thực
 Cách thức mơ hình hóa các mối quan hệ
này trong chương trình



Đặc biệt hóa và tổng quát hóa


Quan hệ là một (is a) là một sự đặc biệt hóa
Khái quát hóa
(Generalization)

Đặc biệt hóa
(Specialization)

Động vật có vú

Chó

Lớp cơ sở (Base class)

Lớp dẫn xuất (Derived class)


Kế thừa
 Trong

C#, một quan hệ đặc biệt hóa,
được cài đặt thông qua kế thừa.
 Khái niệm kế thừa được sử dụng để khai
báo một lớp mới dựa trên lớp đã tồn tại
Người

Công nhân


Khách hàng

Sinh viên


Kế thừa (tt)
 Khai

bao một lớp kế thừa từ một lớp
khác ta sử dụng dấu “:” theo sau là tên
lớp được kế thừa.
 Ví dụ:
Chúng ta đã khai báo lớp người
 Khai báo lớp sinh viên kế thừa lớp người


public class Sinhvien : Nguoi


Kế thừa (tt)
Lớp mới được gọi là lớp dẫn xuất (DerivedClass)
 Lớp được kế thừa gọi là lớp cơ sở (baseclass)
 Một đối tượng của lớp dẫn xuất thì được xem
như một đối tượng của lớp cơ sở của nó
 Một đối tượng lớp cơ sở không được xem
như là một đối tượng của bất kỳ lớp dẫn xuất
nào
 Mọi lớp trong .Net đều kế thừa từ lớp object
(kế thừa không tường minh)




Kế thừa (tt)
 Lưu

ý:

Lớp dẫn xuất sẽ kế thừa tất cả các thành
phần không là private (non-private) của lớp
cơ sở, bao gồm tất cả các phương thức và
biến thành viên.
 Lớp dẫn xuất không kế thừa phương thức
thiết lập ở lớp cơ sở.



Ví dụ 1 : kế thừa
Animal

Cat


Ví dụ 2: kế thừa
public class Nguoi
{ private string ten;
private string quequan; // etc.
public string Ten
{ get { return ten;}
set { ten = value;}
}


public string quequan
{
get { return quequan; }
set { quequan = value; }
}

public void Chaohoi(){
MessageBox.show (“Xin chao từ lớp Nguoi”);
}
} // kết thúc định nghĩa lớp


Ví dụ 2: kế thừa (tt)
public class Sinhvien : Nguoi
{ private string sinhvienid;
public int lop;
public string Sinhvienid
{
get { return sinhvienid; }
set {sinhvienid = value;}

}

public void lenlop()
{ MessageBox.show(“Chúc mùng bạn lên lớp”);
lop++;

}
}


Sinhvien sv = new Sinhvien();
sv.Ten = “21HT2”;
sv.chaohoi();
sv.lenlop();


Ví dụ: kế thừa


Ví dụ 3 : Kế thừa
using System;
namespace vidu2
{
class Inherit
{
static void Main(string[] args)
{
Square squareObj =new Square();
Rectangle rectObj =new Rectangle();
squareObj.calculateArea(10,20);
rectObj.calculateArea(20,20);
}
}
class Shape
{
public int length;
public int breadth;
public void calculateArea(int len, int
breadth);

{
}
}
}

class Rectangle:Shape
{
public Rectangle()
{
length=0;
breadth=0;
}
public void calculateArea(int len, int breadth)
{
Console.WriteLine ("Area of a Rectangle is
{0}",len*breadth);
}
}


Ví dụ 3: Kế thừa
class Square:Shape
{
public Square()
{
}
public void calculateArea(int side1, int side2)
{
int area;
area = side1*side2;

Console.WriteLine ("Area of a Square is
{0}",area);
}
}
}


Bổ từ truy cập “protected”
 Bảo

vệ các thành phần hay các phương
thức chỉ có thể được truy cập:
Trong phạm vi lớp mà các biến, phương
thức được khai báo
 Lớp dẫn xuất


 Sử

dụng từ khóa protected.


Từ khóa base
 Sử

dụng để truy cập đến các thành phần
của lớp cơ sở từ trong lớp dẫn xuất
 Sử dụng để gọi phương thức thiết lập
của lớp cơ sở trong phương thức thiết
khi tạo ra một thể hiện của lớp dẫn xuất

 Sử dụng từ khóa base trong một
phương thức static sẽ báo lỗi


Ví dụ 1: Từ khóa base


Ví dụ 2 : Sử dụng từ khóa base
using System;
public class Window
{
private int top;
private int left;
public Window( int top, int left)
{
this.top = top;
this.left = left;
}
public void DrawWindow()
{
Console.WriteLine(“Drawing Window at {0}, {1}”, top, left);
}

}


Ví dụ : Sử dụng từ khóa base
public class ListBox: Window
{
private string mListBoxContents;

public ListBox(int top, int left, string theContents) : base(top, left)
// gọi phương thức thiết lập của lớp cơ sở
{
mListBoxContents = theContents;
}

public new void DrawWindow()
{
base.DrawWindow();
Console.WriteLine(“ ListBox write: {0}”, mListBoxContents);
}

}


Ví dụ : Sử dụng từ khóa base
public class Tester
{
public static void Main()
{
Window w = new Window(5, 10);
w.DrawWindow();
ListBox lb = new ListBox( 20, 10, “Hello world!”);
lb.DrawWindow();
}

}


Phương thức thiết lập lớp dẫn xuất

 Mặc

định, bất kỳ lớp dẫn xuất nào đầu
tiên đều gọi phương thức thiết lập mặc
định của lớp cơ sở (phương thức thiết
lập không có tham số).
 Gọi tường minh phương thức thiết cơ sở
với từ khóa base.


Phương thức thiết lập lớp dẫn xuất
public class A
{
public A (int n)
{
…}
……..

}

public class B : A
{
public B (int n) : base (n)
{

}
……..

}



Từ khóa sealed
Trong C#, Một lớp đã cho có chính xác duy
nhất lớp cơ sở trực tiếp (Đơn kế thừa)
 Từ khóa sealed được sử dụng để khai báo
một lớp không cho các lớp khác kế thừa


public sealed class A
{

}
public class B : A //Compiler error
{

}


Từ khóa new
 Được

sử dụng như một bổ từ
 Bổ từ new được sử dụng để che dấu
một cách tường minh các thành phần
được kế thừa từ lớp cơ sở
 Sẽ có lỗi nếu sử dụng cả new và
override trên cùng một phương thức


Ví dụ: từ khóa new



×