Bài giảng Kỹ thuật lập trình: Chương 4 - ThS. Phạm Thanh An
Trang 1Chươ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
Trang 2Nội dung trình bày
Trang 3Mục tiêu
tượng trong thế giới thực
này trong chương trình
Trang 4Đặc biệt hóa và tổng quát hóa
Động vật có vú
Chó
Lớp cơ sở (Base class)
Lớp dẫn xuất (Derived class)
Khái quát hóa
(Generalization)
Đặc biệt hóa
(Specialization)
Trang 5Kế thừa
được cài đặt thông qua kế thừa.
báo một lớp mới dựa trên lớp đã tồn tại
Người
Khách hàng Sinh viên Công nhân
Trang 6Kế thừa (tt)
khác ta sử dụng dấu “:” theo sau là tên
lớp được kế thừa.
public class Sinhvien : Nguoi
Trang 7như một đối tượng của lớp cơ sở của nó
như là một đối tượng của bất kỳ lớp dẫn xuất nào
(kế thừa không tường minh)
Trang 8Kế thừa (tt)
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
thiết lập ở lớp cơ sở
Trang 9Ví dụ 1 : kế thừa
Animal
Cat
Trang 10Ví 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”);
Trang 11Ví dụ 2: kế thừa (tt)
public class Sinhvien : Nguoi
{ private string sinhvienid;
public int lop;
public string Sinhvienid
Trang 12Ví dụ: kế thừa
Trang 13Square squareObj =new Square();
Rectangle rectObj =new Rectangle();
public int length;
public int breadth;
public void calculateArea(int len, int
public Rectangle() {
length=0;
breadth=0;
} public void calculateArea(int len, int breadth) {
Console.W riteLine ("Area of a Rectangle is
{0}",len*breadth); }
}
Trang 15Bổ từ truy cập “protected”
thức chỉ có thể được truy cập:
thức được khai báo
Trang 16Từ khóa base
của lớp cơ sở từ trong lớp dẫn xuất
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
phương thức static sẽ báo lỗi
Trang 17Ví dụ 1: Từ khóa base
Trang 18Ví 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);
Trang 19Ví 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);
} }
Trang 21Phương thức thiết lập lớp dẫn xuất
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ố).
với từ khóa base.
Trang 22Phươ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) {
… }
……
}
Trang 23Từ khóa sealed
nhất lớp cơ sở trực tiếp (Đơn kế thừa)
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 {
… }
Trang 24Từ khóa new
một cách tường minh các thành phần được kế thừa từ lớp cơ sở
override trên cùng một phương thức
Trang 25Ví dụ: từ khóa new
Trang 26Từ khóa override
đặt mới của phương thức lớp cơ sở, phương
thức lớp cơ sở phải khai báo là virtual
sở không thể được thay đổi bởi phương thức override ở lớp kế thừa
new, static, virtual không thể sử dụng cùng với bổ
từ override.
Trang 27//new modifier required
new public static int val = 456;
public static void Main() {
//will execute derived class variable Console.WriteLine (val);
} }
Trang 28Ghi đè phương thức (Method Overriding)
cơ sở:
kế thừa với cùng tên
Trang 29public static void Main() {
StringAddition objStringAddition = new StringAddition(); objStringAddition.add();
} }
Trang 30Ví dụ : sử dụng từ khóa new
Trang 31Ví dụ:
using System;
class A
{ public void F() { Console.WriteLine("A.F"); } public virtual void G() { Console.WriteLine("A.G"); } }
class B: A
{ new public void F() { Console.WriteLine("B.F"); } public override void G() { Console.WriteLine("B.G"); } }
Trang 33public virtual void Foo() { Console.WriteLine("Base.Foo");
} }
Trang 34Đa hình
Trang 35public virtual int MethodB() {
return(10);
} public int MethodC() {
return(20);
} }
Trang 36public static void Main() {
Child ObjChild = new Child();
Console.WriteLine("The output is " +ObjChild.MethodA()); }
Trang 37Đa hình
nhiều và morph có nghĩa là hình dạng
(form)
sử dụng nhiều hơn 1 kiểu,
nó có thể là kiểu của chính lớp đó,
hay cũng có thể là kiểu lớp cơ sở.
Trang 38Đa hình
nhiều dạng của một kiểu mà không quan tâm tới chi tiết
có thể thao tác trên nhiều đối tượng của
nhiều lớp khác nhau
Trang 39Tạo một phương thức đa hình
chúng ta khai báo phương thức này là virtual trong lớp cơ sở
đa hình này thêm từ khóa override
Thuộc tính không có hỗ trợ đa hình
Chỉ có phương thức, sự kiện, Property hỗ trợ đa hình
Trang 40Từ khóa virtual
trợ đa hình
phương thức virtual sử dụng từ khóa
override
Trang 41protected int left;
public Control( int top, int left ) { this.top = top;
this.left = left; } public virtual void DrawWindow( ) {
Console.WriteLine( “Vẽ Control tại {0}, {1}", top, left ); }
} // Kết thúc lớp Control
Trang 42Ví dụ: cài đặt đa hình
public class ListBox : Control
{
private string listBoxContents;
public ListBox( int top, int left, string contents ): base(top, left) {
listBoxContents = contents;
} public override void DrawWindow( )
Trang 43Ví dụ: cài đặt đa hình
public class Tester {
static void Main( )
{ Control win = new Control( 1, 2 );
ListBox lb = new ListBox( 3, 4, "Stand alone list box" ); win DrawWindow( );
lb.DrawWindow( );
Control[] win Array = new Control[3];
win Array[0] = new Control( 1, 2 );
win Array[1] = new ListBox( 3, 4, "List box in array" ); for ( in t i = 0; i < 2; i++ )
{ win Array[i].DrawWindow( ); }
} // end hàm main
} //end class Tester } // kết thúc namespace
Trang 44Các điểm ghi nhớ
mình
được gọi tại thời điểm thực thi
đến lượt phương thức virtual lại cần đến overriding
Trang 45Ví dụ: Cài đặt đa hình (tt)
abstract public class Shape
{
public vitual void Draw()
{ Console.WriteLine( “Lop co so”);
{ Console.WriteLine("Drawing the Circle");
}
Trang 46Ví dụ: Cài đặt đa hình (tt)
public class line : Shape
{ public line() { } public override void Draw()
{ Console.WriteLine("Drawing the Line");
}
public class Rectangular : Shape
{ public Rectangular() { } public override void Draw()
{ Console.WriteLine("Drawing the Rectangular ");
Trang 47Các lớp trừu tượng
được kế thừa, những không thể tạo ra đối tượng của lớp.
trong định nghĩa lớp.
phương thức trừu tượng.
Trang 48Các lớp trừu tượng (tt)
đặt chỉ có khai báo
cài đặt phương thức trừu tượng
Trang 49Ví dụ: lớp trừu tượng
using System;
abstract class BaseClass
{
public abstract void MethodA();
public void MethodB()
Trang 51Gốc của tất cả các lớp: Lớp Object
liệu nào thì cũng được dẫn xuất từ lớp
System.Object, bao gồm cả các kiểu dữ liệu giá trị
xuất
các lớp dẫn xuất xa hơn nữa,
hay một kiến trúc phân cấp
Trang 52Gốc của tất cả các lớp: Lớp Object
Multicast Delegate Class2
Class3
Object
Enum1
Structure1 Enum
Primitive types
Boolean
Byte Int16
Int32
Single Double
Decimal DateTime
System-defin ed types
User-defin ed types
Delegate1
Trang 53Gốc của tất cả các lớp: Lớp Object
Trang 54Các lớp lồng nhau (Nesting Classes)
viên này có thể là một lớp khác có kiểu do người dùng định nghĩa (user-defined type)
lớp bên ngoài, và chức năng của các lớp đó như
là lớp trợ giúp (helper class)
trong các lớp ngoài (outer class)
Trang 55Các lớp lồng nhau (Nesting Classes)
Các lớp được định nghĩa bên trong gọi là các lớp lồng (nested class), và lớp chứa được gọi đơn giản là lớp ngoài.
Những lớp lồng có khả năng truy cập đến tất cả các thành viên của lớp ngoài
Một phương thức của lớp lồng có thể truy cập đến
biến thành viên private của lớp ngoài.
Lớp lồng bên trong có thể ẩn đối với tất cả các lớp
khác, lớp lồng có thể là private cho lớp ngoài.
Trang 56 khi đó lớp bên ngoài hành động ít nhiều
giống như một namespace
Thông thường, các lớp lồng hành động như
là các lớp trợ giúp cho lớp chứa, và không được thiết kế cho thế giới bên ngoài.
Trang 57private int numerator;
private int denominator;
public Fraction( int numerator, int denominator)
{ this.numerator = numerator;
this.denominator = den ominator;
}
public override string ToString()
{ return String.Format( "{0}/{1}", numerator, denominator ); }
Trang 58Console.WriteLine( "Drawing the denominator: {0}", f.denominator );
}
} }
Trang 60Ví dụ:
Trang 61Style
Point
Trang 62Ví dụ : Car
Trang 63Ví dụ (tt)
public class Car
{
// Aggregation uses instance of class outside of this class
protected Door FrontRight;
protected Door FrontLeft;
protected Door RearRight;
protected Door RearLeft;
// inner class used to create objects // that are intrinsically linked to the class car
protected class Engine
{ public int horsePower;
}
protected class Battery
{ public int voltage;
}
Trang 64Ví dụ (tt)
//Composition uses instances of objects of inner classes
protected Engine TheEngine;
protected Engine The Battery;
public Car () {
TheEngine = new Engine ();
TheBattery = new Battery ();
Trang 65được đặt lên hàng đầu
lớp, các thuộc tính, các phương thức của lớp
giao diện của lớp và cài đặt lớp
truy cập bởi người sử dụng lớp, có nghĩa làcác thành phần public
đoạn code bên ngoài lớp tương tác với các đốitượng của lớp
Trang 66Interface (tt)
public interface IFile
{ int delFile();
void disFile();
}
public class MyFile : IFile
{ public int delFile() {
System.Console.WriteLine ("DelFile Implementation!"); return(0);
} public void disFile() {
System.Console.WriteLine ("DisFile Implementation!");
Trang 67Interface (tt)
tượng tinh khiết
thức, các thuộc tính, events sẽ được cài đặt
bởi một số lớp
đề, không có bất kỳ cài đặt nào
thành phần được khai báo trong Interface
Trang 69Ví dụ (tt)
public class MyFile : BaseforInterface, IFile
{ public int delFile() {
System.Console.WriteLine ("DelFile Implementation!");
return(0);
} public void disFile() {
System.Console.WriteLine ("DisFile Implementation!"); }
}
Trang 70Interface (tt)
và có thể cài đặt nhiều interface
public interface IFileTwo
{ void applySecondInterface();
}
Trang 71Interface (tt)
public class MyFile : BaseforInterface, IFile, IFileTwo
{ public int delFile() {
System.Console.WriteLine ("DelFile Implementation!"); return(0);
} public void disFile() {
System.Console.WriteLine ("DisFile Implementation!"); }
public void applySecondInterface() {
System.Console.WriteLine ("ApplySecondInterface Implementation!");
} }
Trang 72Cài đặt Interface tường minh
public interface IFile
{ int delFile();
void disFile();
}
public interface IFileTwo
{ void applySecondInterface();
void disFile();
Sử dụng khi hai phương thức cùng chung một tên
ở trong 2 interfaces.
Trang 73Cài đặt Interface tường minh (tt)
public class MyFile : BaseforInterface, IFile, IFileTwo
Trang 74Q&A