object-oriented programs design and construction

37
Page 1 Object-Oriented Programs Design and Construction #6: Dynamic Properties of Objects

Upload: felix-combs

Post on 02-Jan-2016

22 views

Category:

Documents


1 download

DESCRIPTION

Object-Oriented Programs Design and Construction. #6: Dynamic Properties of Objects. Dynamic Properties of Objects. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Object-Oriented Programs Design and Construction

Page 1

Object-Oriented Programs Design and Construction

#6: Dynamic Properties of Objects

Page 2: Object-Oriented Programs Design and Construction

Page 2

Dynamic Properties of Objects

• คุ�ณสมบั�ติของระบับัเชิง OO ที่��ส��คุ�ญอ�กอย่��งหนึ่��งคุ�อก�รที่��กลไกก�รนึ่��เอ�วั�ติถุ�ไปใชิ%ง�นึ่นึ่�&นึ่ กระบัวันึ่ก�รใชิ%ง�นึ่ของวั�ติถุ�อ�จถุ(กปร�บัเปล��ย่นึ่หร�อเปล��ย่นึ่แปลงก�รติอบัสนึ่องไปติ�มวั�ติถุ�อ�กติ�วัที่��ม�ปฏิส�มพั�นึ่ธ์-ก�นึ่ (ม�บัที่บั�ที่เปล��ย่นึ่แปลงไปติ�มวั�ติถุ�ที่��ม�ปฏิส�มพั�นึ่ธ์-ก�นึ่) หร�ออ�จเปล��ย่นึ่แปลงไปติ�มกลไกหร�อร�ย่ละเอ�ย่ดก�รเร�ย่กใชิ% (เปล��ย่นึ่พั�ร�มเติอร-)

• คุ�ณสมบั�ติแรกที่��เร�จะพัจ�รณ�ก�นึ่คุ�อคุวั�มส�ม�รถุในึ่ก�ร overload ของเมธ์อด

• จ�กนึ่�&นึ่ เร�จะม�ด(เก��ย่วัก�บัคุ�ณสมบั�ติที่��เร�ย่กวั�� polymorphism หร�อคุวั�มหล�กหล�ย่ร(ปแบับัของวั�ติถุ� โดย่อ�ศั�ย่กลไกของ virtual method และ abstract method

• ส�ดที่%�ย่ในึ่บัที่นึ่�& เร�จะม�ด(เก��ย่วัก�บัคุ�ณสมบั�ติที่��เร�ย่กวั�� interface ในึ่ภ�ษ� C# ซึ่��งคุ�อ abstract class ที่��ชิ�วัย่เป4นึ่ที่�งออกให% C# ส�ม�รถุเล�ย่นึ่แบับัก�รที่�� multiple inheritance ได% (เพั�ย่งแติ�เร�ติ%องนึ่ย่�มเมธ์อดฝั่6� ง interface เพั�มเติมเองด%วัย่)

Page 3: Object-Oriented Programs Design and Construction

Page 3

Overloading

• ในภาษา C++/C# ได้นาเสนอหลั�กการของ redefinition ในลั�กษณะที่��ผู้�เข�ยนโปรแกรมจะสามารถน#ยามกระบวนการใหปฏิ#บ�ติ#อย(างเหมาะสมก�บขอม�ลัที่��ร�บมาได้

• การที่��กระบวนการหน)�งๆ (หร+อเมธอด้หน)�งๆ) ได้ถ�กน#ยามไวอย(างใด้อย(างหน)�งไวก(อนแลัว แติ(ย�งสามารถที่��จะน#ยามกระบวนการน�-นๆ ใหม((หร+อซ้ำ-าซ้ำอน เพื่+�อใหปฏิ#บ�ติ#)ก�บขอม�ลัประเภที่ใหม(ๆ เพื่+�อใหการติอบสนองติ(อขอม�ลัติ(างชน#ด้ก�น เก#ด้ผู้ลัติ(างก�นน�- เราเร�ยกกระบวนการด้�งกลั(าวว(า overloading

• เราสามารถกระที่า overloadingได้ก�บเมธอด้แลัะโอเปอร1เรเติอร1

Page 4: Object-Oriented Programs Design and Construction

Page 4

Function Overloading & Redefinition of Functions

• ก�รที่��ฟั6งก-ชิ�นึ่โอเวัอร-โหลดดง คุ�อก�รนึ่ย่�มเมธ์อดที่��ม�ชิ��อเด�ย่วัก�นึ่ แติ�ม�ก�รที่��ง�นึ่ที่��แติกติ��งไปจ�กเดม โดย่ให%ก�รที่��ง�นึ่ใหม�นึ่�& ม�ล�กษณะข�&นึ่ก�บัพั�ร�มเติอร-ที่��เร�นึ่ย่�มเมธ์อดนึ่�&นึ่ๆ

• ด�งนึ่�&นึ่ ก�รที่��เมธ์อดติ�วัใด(ที่��ม�ชิ��อซึ่�&�ก�นึ่ ) จะที่��ง�นึ่ ก9จะข�&นึ่อย่(�ก�บัพั�ร�มเติอร-ที่��เข%�ม�

• ก�รที่��โอเวัอร-โหลดดง ย่�งส�ม�รถุกระที่��ก�บัเมธ์อดที่��ส�บัที่อดม�ด%วัย่ก9ได% (ม�ก�รนึ่ย่�มเมธ์อดนึ่�&นึ่ไวั%แล%วัในึ่คุล�สแม� แติ�ก9ม�ก�รนึ่ย่�มซึ่�&�ซึ่%อนึ่ในึ่คุล�สล(ก)

• ในึ่กรณ�ที่��เร�ก��หนึ่ดชิ��อเมธ์อดและพั�ร�มเติอร-ซึ่�&�ก�นึ่ในึ่ระหวั��งคุล�สแม�และคุล�สล(ก ) เร�จะติ%องใส�คุ��สงวันึ่ new นึ่��ก�รนึ่ย่�มเมธ์อดในึ่คุล�สส�บัที่อด(คุล�สล(ก ) เพั��อบั�งบัอกวั��เมธ์อดด�งกล��วัได%ร�บัก�ร redefinition ส��หร�บัคุล�สล(ก

• ในึ่กรณ�ที่��เร�ก��หนึ่ดชิ��อเมธ์อดซึ่�&�ก�นึ่ในึ่คุล�สหล�กและคุล�สส�บัที่อด เร�ส�ม�รถุเจ�ะจงเร�ย่กเมธ์อดที่��นึ่ย่�มในึ่คุล�สแม�ได%โดย่ก�รใชิ% base เพั��ออ%�งถุ�งสม�ชิกในึ่คุล�สแม� และ this เพั��ออ%�งถุ�งสม�ชิกในึ่คุล�สส�บัที่อด

Page 5: Object-Oriented Programs Design and Construction

Page 5

จะเห9นึ่ถุ�งก�รนึ่ย่�มซึ่�&�ด%วัย่พั�ร�มเติอร-ที่��

ติ��งออกไป

Function Overloading & Redefinition of Functions

class aClass{

public void aFunc() {

Console.WriteLine("No parameter"); } public void aFunc(int a) {

Console.WriteLine("One parameter:"+a); } public void aFunc(int a,int b) {

Console.WriteLine("Two parameters:"+a+" and "+b); } public void aFunc(double a) {

Console.WriteLine("One parameter in floating pointformat:"+a);

}}

class Class1{

[STAThread] static void Main(string[] args)

{ aClass myClass = new aClass();

myClass.aFunc();myClass.aFunc(10);

-myClass.aFunc(10, 10);myClass.aFunc(10.5);

}}

กาหนด้แบบไม(ม�

พื่าราม#เติอร1

เร�ย่กใชิ%ในึ่ล�กษณะติ��งๆ

Page 6: Object-Oriented Programs Design and Construction

Page 6

นึ่ย่�มคุร�&งแรกแบับัไม�ม�

พั�ร�มเติอร-

นึ่ย่�มซึ่�&�ซึ่%อนึ่ในึ่คุล�สส�บัที่อด ติ%อง

ม� new

นึ่ย่�มชิ��อซึ่�&�แติ�พั�ร�มเติอร-ไม�ซึ่�&�

ไม�ติ%องม� new

Function Overloading & Redefinition of Functions

class superClass{

public void aFunc(){

Console.WriteLine("No parameter");}

public void aFunc(int a){

Console.WriteLine("(base function)One parameter:"+a);}

} class subClass:superClass

{ public new void aFunc(int a)

{ Console.WriteLine("One parameter:"+a);

} public void aFunc(int a,int b)

{ Console.WriteLine("Two parameters:"+a+" and "+b);

} public void aFunc(double a)

{ Console.WriteLine("One parameter in floating point format:"+a);

} public void getTwoAFunc(int a)

{base.aFunc(a);this.aFunc(a);

}}

class Class1{

[STAThread] static void Main(string[] args)

{ subClass myClass = new subClass();

myClass.aFunc();myClass.aFunc(10);

-myClass.aFunc(10, 10);myClass.aFunc(10.5);myClass.getTwoAFunc(5);

}}

ส�งเกติก�รใชิ% base/this

Page 7: Object-Oriented Programs Design and Construction

Page 7

Operator Overloading

• นึ่อกจ�กก�รที่��โอเวัอร-โหลดดงก�บัเมธ์อดแล%วั เร�ย่�งส�ม�รถุกระที่��โอเวัอร-โหลดดงก�บัโอเปอร-เรเติอร-ได%ด%วัย่เชิ�นึ่ก�นึ่

• ก�รที่��โอเวัอร-โหลดดงก�บัโอเปอร-เรเติอร- ใชิ%เพั��อก�รนึ่ย่�มซึ่�&� (redefinition) ก�บักระบัวันึ่ก�รที่��กระที่��ก�บัออปเจ9คุติ-ชินึ่ดใดชินึ่ดหนึ่��งเป4นึ่ก�รเฉพั�ะ

• ใชิ%คุ��สงวันึ่ operator เพั��อบั�งบัอกก�รที่��โอเวัอร-โหลดดงก�บัโอเปอร-เรเติอร- และติ�มด%วัย่ติ�วัโอเปอร-เรเติอร-ที่��ติ%องก�รที่��โอเวัอร-โหลดดง ในึ่ก�รนึ่ย่�มเมธ์อดเพั��อกระที่��ก�รโอเวัอร-โหลดดง

• ก�รใชิ%ง�นึ่โอเปอร-เรเติอร-ที่��ได%ร�บัก�รโอเวัอร-โหลดดง ใชิ%ง�นึ่ในึ่ร(ปเหม�อนึ่เดม เพั�ย่งแติ�ใชิ%ก�บัติ�วัโอเปอร-แรนึ่ด-ที่��ม�ชินึ่ดสอดคุล%องก�บัที่��ได%นึ่ย่�มไวั%

• หม�ย่เหติ� ก�รนึ่ย่�มซึ่�&�ก�บักระบัวันึ่ก�รที่��กระที่��ก�บัออปเจ9คุติ-ที่��ม�ชินึ่ดพั�&นึ่ฐ�นึ่ก9กระที่��ได% แติ�ไม�คุวัรกระที่��เพัร�ะจะที่��ให%ผู้(%เข�ย่นึ่โปรแกรมคุนึ่อ��นึ่อ�จเกดคุวั�มส�บัสนึ่ติ�อโคุ%ดของเร�

Page 8: Object-Oriented Programs Design and Construction

Page 8

Operator Overloading using System;

namespace operatoroverloading{

class complex{

private double r; private double i;

public double R{

get{ return r;} set{ r=value;}

} public double I

{ get{ return i;} set{ i=value;}

} public complex()

{this.r=this.i=0.0;

} public complex(double r,double i)

{this.r=r;this.i=i;

}

ติ�วัอย่��งติ�อไปนึ่�& เป4นึ่ก�รสร%�งคุล�ส complex เพั��อใชิ%จ�ดก�รจ��นึ่วันึ่เชิงซึ่%อนึ่ โดย่ม�ก�รที่�� overloading operator จ��นึ่วันึ่ส��ติ�วัด%วัย่ก�นึ่คุ�อ บัวัก ลบั คุ(ณ และห�ร ส�วันึ่ก�รนึ่ย่�มคุล�ส complex ส�วันึ่นึ่�&นึ่ย่�ม properties และ constructor ของคุล�ส

Page 9: Object-Oriented Programs Design and Construction

Page 9

Operator Overloading

static public complex operator +(complex a,complex b){

return new complex(a.R+b.R,a.I+b.I);}

- static public complex operator (complex a,complex b){

- -return new complex(a.R b.R,a.I b.I);}

static public complex operator *(complex a,complex b){

-return new complex(a.R*b.R a.I*b.I,a.R*b.I+a.I*b.R);}

static public complex operator /(complex a,complex b){

return newcomplex((a.R*b.R+a.I*b.I)/(b.R*b.R+b.I*b.I),

-(a.I*b.R a.R*b.I)/(b.R*b.R+b.I*b.I));}

}

ส�งเกติก�ร สร%�ง

โอเวัอร-โหลดดงโอ

เปอร-เรเติอร-ที่�&งส��

Page 10: Object-Oriented Programs Design and Construction

Page 10

Operator Overloading class Class1

{

[STAThread] static void Main(string[] args)

{ complex x=new complex(2,4); complex y=new complex(5,3); complex resultadd; complex resultsub; complex resultmul; complex resultdiv;

resultadd = x+y; -resultsub = x y; resultmul = x*y;

resultdiv = x/y; Console.WriteLine("x+y=("+ resultadd.R + ")+i(" + resultadd.I+")");

- Console.WriteLine("x y=("+ resultsub.R + ")+i(" + resultsub.I+")"); Console.WriteLine("x*y=("+ resultmul.R + ")+i(" + resultmul.I+")"); Console.WriteLine("x/y=("+ resultdiv.R + ")+i(" + resultdiv.I+")");

}}

}

จะเห9นึ่วั�� ในึ่ก�รใชิ%ง�นึ่ เร�ใชิ%ง�นึ่โอเปอร-เร

เติอร-นึ่�& ร�วัก�บัวั��เป4นึ่ก�รกระที่��ธ์รรมด� (แติ�ในึ่ที่��นึ่�&เร�ได% นึ่ย่�ม

โอเปอร-เรเติอร-ใหม�แล%วั

จะเห9นึ่วั��ติ�วัคุ��ติอบัเร�ไม�ได% สร%�งอนึ่สแตินึ่ติ-ใหม� เหติ�เพัร�ะในึ่ก�รนึ่ย่�มโอเวัอร-โหลดดงโอเปอร-เร

เติอร-ที่��สร%�งเองนึ่�&นึ่ เร�ได%สร%�งอนึ่สแตินึ่ติ-ใหม�และส�งคุ�� reference

ของอนึ่สแตินึ่ติ-ด�งกล��วักล�บัม�แล%วั

Page 11: Object-Oriented Programs Design and Construction

Page 11

New and Inheritance

class Animal{

public void Say(){

Console.WriteLine("I am an animal");}

}

class Dog:Animal{

public new void Say(){

Console.WriteLine("I am a dog");}

} class Bulldog:Dog

{ public new void Say()

{ Console.WriteLine("I am a Bulldog");

}}

ให%เร�ม�ด(โคุ%ดติ�อไปนึ่�& พัจ�รณ�วั��คุ��ติอบัคุวัรเป4นึ่เชิ�นึ่ใด???

Page 12: Object-Oriented Programs Design and Construction

Page 12

New and Inheritance• ส�งแรกที่��เร�เห9นึ่ก9คุ�อ แม%วั��เร�จะ

ก��หนึ่ดคุล�สม�ชิ��อแติกติ��งก�นึ่ แติ�เร�พับัวั��เร�ส�ม�รถุก��หนึ่ดให%อนึ่สแตินึ่ติ-ที่��สร%�งข�&นึ่นึ่�&นึ่ ม�โคุรงสร%�งองจ�กร(ปคุล�สส�บัที่อดหล�งส�ดได% ที่�&งนึ่�&โคุรงสร%�งล(กถุ(กนึ่ย่�มม� ร�ย่ละเอ�ย่ดของโคุรงสร%�งแม�อย่(�ภ�ย่ในึ่แล%วั

class Class1{

[STAThread] static void Main(string[] args)

{ Animal dog1 = new Bulldog();

Dog dog2 = new Bulldog(); 3Bulldog dog = new Bulldog(); 4 = ( ) 1;Bulldog dog Bulldog dog

1.();dog2.Say();3dog .Say();

dog4.Say();}

}

Page 13: Object-Oriented Programs Design and Construction

Page 13

New and Inheritance

1Animal dog = new Bulldog(); 2 =( );

3 = ();Bulldog dog new Bulldog 4 = ( ) 1;Bulldog dog Bulldog dog

• ประก�รติ�อม� เร�จะเห9นึ่วั�� แม%วั��เร�จะนึ่ย่�มอนึ่สแตินึ่ติ-โดย่องร(ปจ�กคุล�ส Bulldog แติ�เวัล�เร�เข%�ถุ�งเมธ์อด ผู้ลของเมธ์อดที่��เร�ย่กนึ่�&นึ่ เป4นึ่ไปติ�มชินึ่ดของ reference

• เร�ส�ม�รถุถุ��ย่คุ�� reference ม�จ�ก dog1 ซึ่��งม�ชินึ่ดเป4นึ่ animal ได% โดย่ก�รที่�� casting (กระที่��ได%ห�กส�บัที่อดม�โดย่ติรงแบับันึ่�&เที่��นึ่�&นึ่ ) และส�งเกติวั��แม%เร�จะเข%�ถุ�งอนึ่สแตินึ่ติ-ที่��สร%�งโดย่เก9บัคุ�� reference ที่�� dog1 ผู้��นึ่ dog4 แติ�จะเห9นึ่วั��ก�รเข%�ถุ�งเมธ์อดจะเป4นึ่ไปติ�ม ชินึ่ดของ reference อย่(�ด�

Page 14: Object-Oriented Programs Design and Construction

Page 14

New and Inheritance

Bulldogsay()

Dog

say()Animalsay()

Bulldogsay()

Dog

say()Animalsay()

Bulldogsay()

Dog

say()Animalsay()

dog1

dog2

dog3

(Animal)

(Dog)

(Bulldog)

dog4(Bulldog)

แม%วั��จะร�บัคุ��อ%�งองม�จ�ก dog1 แติ�ก�รเข%�ถุ�งเมธ์อดเป4นึ่ไปติ�มชินึ่ดของม�นึ่เอง

Page 15: Object-Oriented Programs Design and Construction

Page 15

Virtual Methods

• ห�กเร�ติ%องก�รให%เมธ์อดที่��ก��หนึ่ดไวั%ในึ่คุล�สหล�ก เป4นึ่เมธ์อดที่��ม�คุวั�มส��คุ�ญรองลงไป โดย่ ก��หนึ่ดให%เมธ์อดที่��ก��หนึ่ดไวั%ในึ่คุล�สส�บัที่อดเป4นึ่ติ�วัที่��จะถุ(กอ%�งองเป4นึ่หล�ก เร�จะใชิ%คุ��สงวันึ่ virtual นึ่��หนึ่%�เมธ์อดของคุล�สหล�ก และใชิ% override นึ่��หนึ่%�เมธ์อดที่��จะนึ่ย่�มซึ่�&�ในึ่คุล�สส�บัที่อด

ให%นึ่�กศั�กษ�ลองแก%โคุ%ดก�อนึ่หนึ่%�

เป4นึ่ด�งด%�นึ่ซึ่%�ย่แล%วัคุอมไพัล-ใหม�

class Animal{

virtual public void Say(){

Console.WriteLine("I am an animal");

}}

class Dog:Animal{

override public void Say(){

Console.WriteLine("I am a dog");}

} class Bulldog:Dog

{ override public void Say()

{ Console.WriteLine("I am a

Bulldog");}

}

Page 16: Object-Oriented Programs Design and Construction

Page 16

Virtual and Override

Bulldogsay()

Dog

say()Animalsay()

Bulldogsay()

Dog

say()Animalsay()

Bulldogsay()

Dog

say()Animalsay()

dog1

dog2

dog3

(Animal)

(Dog)

(Bulldog)

dog4(Bulldog)

Page 17: Object-Oriented Programs Design and Construction

Page 17

Virtual Methods

• ขอกาหนด้เก��ยวก�บการใช new/virtual/override ระหว(างคลัาสหลั�กแลัะคลัาสส+บที่อด้– virtual ใชก�บคลัาสหลั�กติ�วฐานส5ด้– คลัาสที่��ส+บที่อด้ติ(อมาก��ที่อด้ ใช override ได้ติลัอด้– จากน�-นเป6น new ซ้ำ)�งจะม�อ�กก��ที่อด้ก7ได้

• ใหน�กศึ)กษาลัองด้�การส+บที่อด้ในลั�กษณะที่��คลัาสลั�กสองติ�วส+บที่อด้จากคลัาสแม(ร(วมก�น ลัองด้�ว(าเก#ด้ผู้ลัอย(างไร เม+�อเราใช virtual/override ในการน#ยามคลัาสติ(างๆด้�งกลั(าว

Page 18: Object-Oriented Programs Design and Construction

Page 18

Virtual Methods SSSSSS S;

namespace polymorph{

SSSSS SSSS{

SSSSSSS SSSSS( ){

. ( " " ) ;}

}

class ThaiNorth:Thai{

override public void Say(){

Console.WriteLine("I am a Northern Thai");}

}

class ThaiSouth:Thai{

override public void Say(){

Console.WriteLine("I am a Southern Thai");}

}

Page 19: Object-Oriented Programs Design and Construction

Page 19

Virtual Methods

class Class1{

[STAThread] static void Main(string[] args)

{ Thai man1 =newThai(); Thai man2=newThaiNorth(); Thai man3=newThaiSouth();

Thaiman;

man1 .Say();man2 .Say();man3 .Say();

Console.Write("Whoareyou?"); man = man1 ;

man.Say(); Console.Write("Whoareyou?");

man = man2 ;man.Say();

Console.Write("Whoareyou?"); man = man3 ;

man.Say();}

}}

จะเห9นึ่วั�� เร�ก��หนึ่ด man ข�&นึ่ม�จ�กคุล�ส Thai แติ�เม��อเร�นึ่��เอ�ไปร�บัคุ�� reference จ�กอนึ่สแตินึ่ติ-ที่�&งส�มติ�วั ปร�กฏิวั��ก�รเร�ย่กใชิ%เมธ์อดเด�ย่วัก�นึ่แที่%ๆ แติ�กล�บัให%คุ��แติกติ��งก�นึ่ไปติ�ม อนึ่สแตินึ่ติ-ที่�� man อ%�งถุ�ง

!!!

Page 20: Object-Oriented Programs Design and Construction

Page 20

Polymorphism

• คุ�ณสมบั�ติ polymorphism คุ�อคุ�ณสมบั�ติที่��ก�รอ%�งถุ�งองคุ-ประกอบัหนึ่��งๆ ของวั�ติถุ� ส�ม�รถุแปรเปล��ย่นึ่ไปได%ติ�มสภ�พัก�รอ%�งถุ�งหร�อนึ่ย่�ม

• เร�ได%เห9นึ่จ�กหล�ย่กรณ�ด%วัย่ก�นึ่ ในึ่กรณ�แรก เร�จะเห9นึ่วั��เร�ส�ม�รถุนึ่ย่�มชิ��อเมธ์อดในึ่คุล�สส�บัที่อดซึ่�&�ก�บัคุล�สหล�ก(โดย่ม�ล�กษณะพั�ร�มเติอร-เหม�อนึ่ก�นึ่)ได%โดย่ก�รใชิ% new ประกอบัก�รนึ่ย่�มในึ่คุล�สส�บัที่อด (ซึ่��งก�รพัจ�รณ�วั��จะใชิ%เมธ์อดใดจะข�&นึ่อย่(�ก�บัชินึ่ดของ reference

• ในึ่กรณ�ถุ�ดม� เร�ใชิ% virtual/override เพั��อให%ผู้ลของก�รอ%�งเมธ์อด เป4นึ่ไปติ�มคุล�สติ%นึ่แบับัที่��นึ่��ม�ใชิ%สร%�งอนึ่สแตินึ่ติ- จะเห9นึ่วั�� แม%วั��เร�จะก��หนึ่ดชินึ่ดของ reference แติกติ��งก�นึ่ไปแติ�ก9จะไม�ม�ผู้ลติ�อกรณ�หล�งนึ่�&

• ติ�วัอย่��งติ�อม�ที่��นึ่��สนึ่ใจก9คุ�อ ก�รที่��เร�นึ่ย่�มชินึ่ดของ reference ด%วัย่คุล�สหล�ก และนึ่��ไปร�บัคุ�� reference ของอนึ่สแตินึ่ติ-ติ��งประเภที่ก�นึ่ไป (ที่��นึ่ย่�มเมธ์อดด%วัย่ virtual/override) เร�จะเห9นึ่วั��แม%วั��เร�เร�ย่กใชิ%เมธ์อดเด�ย่วัก�นึ่ แติ�ผู้ลที่��ออกม�นึ่�&นึ่จะแติกติ��งไปติ�มอนึ่สแตินึ่ติ-ที่��อ%�งถุ�ง

Page 21: Object-Oriented Programs Design and Construction

Page 21

Abstract Class• ในึ่ติ�วัอย่��งก�อนึ่หนึ่%� สมมติวั��เร�สร%�งคุล�ส ThaiUnknown ข�&นึ่ม�

ส�บัที่อดจ�กคุล�ส Thai โดย่ไม�นึ่ย่�มเมธ์อด Say() เม��อเร�สร%�งอนึ่สแตินึ่ติ-จ�กคุล�ส ThaiUnknown แล%วัเร�ย่กใชิ%เม ธ์อด Say() จะเที่��ก�บัไปเร�ย่กใชิ%เมธ์อด Say() ที่��ได%นึ่ย่�มเอ�ไวั%ในึ่คุล�ส Thai ซึ่��งเป4นึ่คุล�สหล�ก ซึ่��งเข%�ล�กษณะก�รส�บัที่อดติ�มปกติ

• แติ�ในึ่ก�รออกแบับัคุล�สในึ่บั�งกรณ� เร�ติ%องก�รก��หนึ่ดข�&นึ่ลอย่ๆ ถุ�งกระบัวันึ่ก�รที่��เป4นึ่ไปได%ไวั%ภ�ย่ใติ%คุล�สหล�ก แล%วัในึ่คุล�สส�บัที่อดติ��งๆ คุ�อย่ม�นึ่ย่�มร�ย่ละเอ�ย่ดกระบัวันึ่ก�รติ�อไป โดย่เร�ม��งหวั�งวั��เร�ไม�นึ่��เอ�คุล�สหล�กไปใชิ%สร%�งอนึ่สแตินึ่ติ-ใดๆ โดย่ติรง และหวั�งวั��จะให%ใชิ%คุล�สที่��ส�บัที่อดม�สร%�งอนึ่สแตินึ่ติ-เที่��นึ่�&นึ่ ก�รที่��เชิ�นึ่นึ่�&จะที่��ให%ก�รนึ่ย่�มกระบัวันึ่ก�รที่��ง�นึ่ในึ่เมธ์อดที่��ก��หนึ่ดไวั%ในึ่คุล�สหล�กนึ่�&นึ่ เปล��ประโย่ชินึ่-

• ในึ่ที่��นึ่�&เร�จะก��หนึ่ดเมธ์อดด�งกล��วัโดย่นึ่ย่�มไวั%แติ�ห�วัเมธ์อดโดย่ไม�นึ่ย่�มส�งอ��นึ่ใดที่��เป4นึ่ติ�วัเมธ์อด และใชิ%คุ��สงวันึ่ abstract ก��ก�บัเมธ์อดและคุล�สที่��ม�เมธ์อดด�งกล��วั เมธ์อดด�งกล��วัเร�ย่กวั�� Abstract method และคุล�สด�งกล��วัเร�ย่กวั�� Abstract Class

Page 22: Object-Oriented Programs Design and Construction

Page 22

Abstract Class

abstract class Thai{

abstract public void Say();}

class ThaiNorth:Thai{

override public void Say(){

Console.WriteLine("I am a Northern Thai");}

}

class ThaiSouth:Thai{

override public void Say(){

Console.WriteLine("I am a Southern Thai");}

}

หม�ย่เหติ� ในึ่ C# ส�ม�รถุก��หนึ่ด abstract ได%ก�บั

ก�รนึ่ย่�มเมธ์อดและพัรอปเพัอร-ติ�

Page 23: Object-Oriented Programs Design and Construction

Page 23

Abstract Class 1class Class

{[] ([] ){

Thai man1=new ThaiNorth(); Thai man2=new ThaiSouth(); Thai man;

1.();2man .Say();

Console.Write("Who are you? "); 1man = man ;

man.Say(); Console.Write("Who are you? ");

2man = man ;man.Say();

}}

Page 24: Object-Oriented Programs Design and Construction

Page 24

Interface

• ในึ่ภ�ษ�ภ�ย่ใติ%แนึ่วัคุด OO บั�งติ�วั(เชิ�นึ่ C++) ส�ม�รถุส�บัที่อดจ�กคุล�สหล�กได%ม�กกวั��หนึ่��งคุล�ส ซึ่��งเร�จะเร�ย่กวั�� multiple inheritance

• ในึ่ C# ไม�ย่อมให%ม�ก�รที่�� multiple inheritance แติ�จะย่อมให%เร�ส�ม�รถุส�บัที่อดจ�ก abstract class ที่��สม�ชิกที่�กติ�วัเป4นึ่ abstract ได%ม�กกวั��หนึ่��ง

• interface คุ�อ abstract class ที่��สม�ชิกจะเป4นึ่ abstract properties หร�อ abstract methods เที่��นึ่�&นึ่ โดย่เร�จะใชิ%คุ��สงวันึ่ interface นึ่��หนึ่%�ก�รก��หนึ่ด และสม�ชิกที่�กติ�วัจะไม�ม�ส�วันึ่ก�รนึ่ย่�มร�ย่ละเอ�ย่ด ม�แติ�ก�รนึ่ย่�มชิ��อและพั�ร�มเติอร-เที่��นึ่�&นึ่

• ก�รใชิ%ง�นึ่ interface กระที่��ผู้��นึ่ก�รก��หนึ่ดคุล�สที่��วัไปที่��จะติ%องอ%�งถุ�ง interface (ห�กม�ก�รส�บัที่อดคุล�สหร�อม�อนึ่เที่อร-เฟัสอ��นึ่ๆ อ�ก จะติ%องคุ��นึ่ด%วัย่เคุร��องหม�ย่ , ) และจะติ%องม�ก�รนึ่ย่�มร�ย่ละเอ�ย่ดของเมธ์อดหร�อพัรอปเพัอร-ติ�ที่��ปร�กฏิไวั%ในึ่อนึ่เที่อร-เฟัส ให%เร�ย่บัร%อย่คุรบัถุ%วันึ่ด%วัย่

Page 25: Object-Oriented Programs Design and Construction

Page 25

Interface using System;

namespace animalinterface{

interface IFlyable{

void Fly(double kilometre); double WingSize

{ get; set;

}}

interface IWalkable{

void Walk(double kilometre); int NumLeg

{ get; set;

}}

class Animal{

void Say(){

Console.WriteLine("I am an animal");}

}

นึ่ย่�มเมธ์อดและพัรอปเพัอร-ติ�โดย่ไม�ก��หนึ่ดร�ย่ละเอ�ย่ด

Page 26: Object-Oriented Programs Design and Construction

Page 26

Interface class Bird:Animal,IFlyable,IWalkable

{ private double wingSpan; private int leg;

public double WingSize{

get{ return wingSpan; } set{ wingSpan = value; }

} public int NumLeg

{ get{ return leg; } set{ leg = value; }

} public void Fly(double kilometre)

{ Console.WriteLine("I am flying for "+kilometre+" km.");

} public void Walk(double kilometre)

{ Console.WriteLine("I am jumping for "+kilometre+" km.");

}

}

ส�งเกติวั��เร�จะติ%องนึ่ย่�มร�ย่ละเอ�ย่ดของ เมธ์อดและพัรอปเพัอร-ติ�ที่��ก��หนึ่ดไวั%ในึ่อนึ่เที่อร-เฟัซึ่ให%เร�ย่บัร%อย่ด%วัย่

Page 27: Object-Oriented Programs Design and Construction

Page 27

Interface class Cat:Animal,IWalkable

{ private int leg;

public int NumLeg{

get{ return leg; } set{ leg = value; }

} public void Walk(double kilometre)

{ Console.WriteLine("I am walking for "+kilometre+" km.");

}}

class Class1{

[STAThread] static void Main(string[] args)

{ Bird parrot = new Bird();

Cat thaiCat= new Cat();

parrot.Fly(10);parrot.Walk(12);thaiCat.Walk(4);

}}

}

ใชิ%ง�นึ่ติ�มปกติ

Page 28: Object-Oriented Programs Design and Construction

Page 28

Interface

• ในกรณ�ที่��ม�การน#ยามเมธอด้ช+�อซ้ำ-าก�นจากติ(างอ#นเที่อร1เฟส เราสามารถกาหนด้ว(าจะเร�ยกเมธอด้ที่��ถ�กน#ยามจากอ#นเที่อร1เฟสแติ(ลัะติ�วได้โด้ยการอางช+�ออ#นเที่อร1เฟซ้ำกาก�บไวที่��เมธอด้ในคลัาสส+บที่อด้

• ในกรณ�ที่��ม�ช+�ออ#นเที่อร1เฟสกาก�บไวก�บเมธอด้ที่��เรากาลั�งน#ยาม ก7ไม(ติองใส(คาสงวน public กาก�บเมธอด้ที่��จะติองน#ยามรายลัะเอ�ยด้ไวอ�ก

• เวลัาเร�ยกใชงานเมธอด้ที่��ม�ช+�อซ้ำ-าก�น เราสามารถเจาะจงอ#นเที่อร1เฟสที่��ติองการโด้ยกรรมว#ธ� casting

Page 29: Object-Oriented Programs Design and Construction

Page 29

Interface

interface IFlyable{

void Fly(double kilometre); void spreadMyLimb();

double WingSize{

get; set;}

} interface IWalkable

{ void Walk(double kilometre); void spreadMyLimb();

int NumLeg{

get; set;}

}

class Animal{

void Say(){

Console.WriteLine("I am an animal");}

}

class Cat:Animal,IWalkable{

private int leg;

public int NumLeg{

get{ return leg; } set{ leg = value; }

} public void Walk(double kilometre)

{ Console.WriteLine("I am walking for "+kilometre+" km.");

} public void spreadMyLimb()

{ Console.WriteLine("I am spreading all of my

legs.");}

} ติ�วัอย่��งนึ่�&ปร�บัจ�กติ�วัอย่��งก�อนึ่หนึ่%� โดย่เพั�มเมธ์อด spreadMyLimb() ที่��อนึ่เที่อร-เฟัสที่�&งสองติ�วั ส�งเกติก�รนึ่ย่�มในึ่คุล�ส Bird ที่��ม�คุวั�มซึ่�บัซึ่%อนึ่ข�&นึ่จ�กเดม

Page 30: Object-Oriented Programs Design and Construction

Page 30

Interface class Bird:Animal,IFlyable,IWalkable

{ private double wingSpan; private int leg;

public double WingSize{

get{ return wingSpan; } set{ wingSpan = value; }

} public int NumLeg

{ get{ return leg; } set{ leg = value; }

} public void Fly(double kilometre)

{ Console.WriteLine("I am flying for "+kilometre+"

km.");}

public void Walk(double kilometre){

Console.WriteLine("I am jumping for "+kilometre+" km.");}

void IFlyable.spreadMyLimb(){

Console.WriteLine("I am spreading my wings");}

void IWalkable.spreadMyLimb(){

Console.WriteLine("I am spreading my legs");}

}

แก%ป6ญห� ชิ��อเมธ์อดติ��งอนึ่เที่อร-เฟัสชินึ่ก�นึ่ด%วัย่ก�รอ%�งชิ��ออนึ่เที่อร-เฟัสด%วัย่

Page 31: Object-Oriented Programs Design and Construction

Page 31

อ%�งเมธ์อดที่��นึ่ย่�มไวั%ในึ่

อนึ่เที่อร-เฟัสด%วัย่วัธ์�ปกติ

Interface class Class1

{[STAThread]

static void Main(string[] args){

Bird parrot = new Bird();IFlyable flyingParrot = (IFlyable)parrot;

IWalkable walkingParrot = (IWalkable)parrot; Cat thaiCat= new Cat();

parrot.Fly(10);parrot.Walk(12);((IWalkable)parrot).spreadMyLimb();((IFlyable)parrot).spreadMyLimb();walkingParrot.spreadMyLimb();flyingParrot.spreadMyLimb();thaiCat.Walk(4);thaiCat.spreadMyLimb();

}}

อ�ศั�ย่ก�ร casting เพั��อ

บั�งวั��จะเข%�ถุ�งเมธ์อด

ภ�ย่ใติ% อนึ่เที่อร-เฟัสใด

นึ่ย่�ม reference ให%ม�ชินึ่ดติ�มอนึ่เที่อร-เฟัสที่��ติ%องก�ร และก��หนึ่ดให%

อ%�งไปย่�งอนึ่สแตินึ่ติ-ที่��ติ%องก�ร

ห�กนึ่ย่�ม reference เพั��อชิ�&ไปย่�งอนึ่สแตินึ่ติ-ที่��

ติ%องก�รติ�มอนึ่เที่อร-เฟัสที่��ติ%องก�รแล%วั ส�ม�รถุเข%�

ถุ�งเมธ์อดนึ่�&นึ่ๆได%ที่�นึ่ที่�

Page 32: Object-Oriented Programs Design and Construction

Page 32

Interface

• นอกจากกลัไกการใชงานอ#นเที่อร1เฟสในสองร�ปแบบที่��กลั(าวมาแลัว เราย�งสามารถน#ยามเมธอด้กลัางสาหร�บใชก�บอ#นสแตินติ1ใด้ๆ ที่��ม�ค5ณสมบ�ติ#ติามอ#นเที่อร1เฟสที่��ได้น#ยามไวภายใติคลัาส โด้ยกาหนด้เพื่#�มพื่าราม#เติอร1อ�กหน)�งติ�วในเมธอด้กลัางน�- ใหม�ชน#ด้เป6นอ#นเที่อร1เฟสที่��ติองการ แลัะเราส(งผู้(านค(า reference ของอ#นสแตินติ1ที่��ติองการเขาไปย�งอ#นเที่อร1เฟสน�-

• ในส(วนคาส��งการที่างานของเมธอด้กลัาง เราก7เขาถ)งเมธอด้ที่��น#ยามภายใติอ#นเที่อร1เฟสติามปกติ#

• การน#ยามในลั�กษณะน�- ที่าใหผู้�เข�ยนโปรแกรมสามารถปร�บปร5งพื่�ฒนาเมธอด้ที่��น#ยามภายใติอ#นเที่อร1เฟสได้สะด้วก ลัด้การผู้�กติ#ด้ก�บส(วนที่��เร�ยกใชเมธอด้

• ลัองด้�ติ�วอย(างติ(อไปน�-ว(าม�การน#ยามที่างานอย(างไร

Page 33: Object-Oriented Programs Design and Construction

Page 33

Interface interface IFlyable

{ void Fly(double kilometre);

}

class Animal{

void Say(){

Console.WriteLine("I am an animal");}

}

class Bird:Animal,IFlyable{

public void Fly(double kilometre){

Console.WriteLine("A bird is flying for "+kilometre+" km.");}

}

class Duck:Animal,IFlyable{

public void Fly(double kilometre){

Console.WriteLine("A duck is flying for "+kilometre+"km.");

}}

Page 34: Object-Oriented Programs Design and Construction

Page 34

Interface

class TheMainClass{

[STAThread] public static void Flying(IFlyable anAnimal,double kilometre)

{anAnimal.Fly(kilometre);

}

static void Main(string[] args){

Bird parrot = new Bird(); Duck waterDuck = new Duck();

Flying(parrot,10);Flying(waterDuck,12);

}}

ผู้��นึ่คุ�� reference

ของอนึ่สแตินึ่ติ-เข%�ม�ที่�งนึ่�&

ส�งเกติก�รเร�ย่กใชิ%เมธ์อดกล�งโดย่ผู้��นึ่คุ��

reference ของอนึ่สแตินึ่ติ-เข%�ไป

Page 35: Object-Oriented Programs Design and Construction

Page 35

Conclusion

• การโอเวอร1โหลัด้ด้#งกระที่าได้ก�บเมธอด้แลัะโอเปอร1เรเติอร1• กระบวนการโอเวอร1โหลัด้ด้#ง เป6นความสามารถพื่+-นฐานของ

ภาษาเช#ง OO ที่��นาเสนอค5ณสมบ�ติ# redefinition• Polymorphism ค+อการที่��เราสามารถน#ยามเมธอด้ช+�อ

เด้�ยวก�นพื่าราม#เติอร1เหม+อนก�น ใหม�กระบวนการที่างานที่��แติกติ(างก�นออกไป การที่��จะม�การเร�ยกใชกระบวนการใด้น�-น ข)-นอย�(ก�บกลัไกการเร�ยกใชแลัะการน#ยาม

• เราเห7นค5ณสมบ�ติ#ของ Polymorphism โด้ยการน#ยาม virtual method (การใช virtual/override/new) ซ้ำ)�งที่าใหเราสามารถน#ยามเมธอด้ที่��ม�ช+�อเด้�ยวก�น แติ(ม�กระบวนการที่างานที่��แติกติ(างก�นภายใติ อ#นสแตินติ1ที่��ม�แม(แบบจากคลัาสติ(างก�น (แติ(ม�การส+บที่อด้ร(วมก�น)

Page 36: Object-Oriented Programs Design and Construction

Page 36

Conclusion (Cont.)

• เราย�งได้เห7นค5ณสมบ�ติ#ของการที่า dynamic binding (หร+อเร�ยกอ�กอย(างว(า late binding) อ�นเป6นผู้ลัจากการเร�ยกใชงานเมธอด้ที่��ม�ค5ณสมบ�ติ# polymorphism โด้ยส�งเกติจากติ�วอย(างที่��ม�การน#ยาม reference ข)-นมา เม+�อนาเอาค(า reference value จากอ#นสแตินติ1หน)�งๆ มาใสไวในติ�วแปร reference น�-แลัะอาศึ�ยติ�วแปร reference น�-เขาถ)งเมธอด้ที่��ม�ค5ณสมบ�ติ# polymorphism เราจะเห7นว(าแมเราจะเร�ยกช+�อเมธอด้เด้#มๆ แติ(เม+�อเราเปลั��ยนอ#นสแตินติ1ที่��เราจะเขาถ)ง เราจะพื่บว(าผู้ลัการที่างานของโปรแกรมก7จะเปลั��ยนไปติามอ#นสแตินติ1น�-นๆ ด้วยโด้ยอ�ติโนม�ติ# (กระบวนการด้�งกลั(าวเก#ด้ขณะที่��โปรแกรมกาลั�งร�น ไม(ใช(อย�(ภายใติโคด้ที่��คอมไพื่ลั1 เราจ)งเร�ยกว(าเป6น dynamic binding ของเมธอด้)

Page 37: Object-Oriented Programs Design and Construction

Page 37

Conclusion (Cont.)

• จ�กนึ่�&นึ่ เร�ได%เร�ย่นึ่ร(%ถุ�ง Abstract Class ซึ่��งม�ประโย่ชินึ่-ใชิ%ส��หร�บันึ่ย่�มโคุรงร��งที่��วัไปของคุ�ณสมบั�ติที่��จะใชิ%ร�วัมก�นึ่ในึ่คุล�สติ��งๆ

• จ�กนึ่�&นึ่เร�เห9นึ่ถุ�งโคุรงสร%�งที่�งภ�ษ�ที่��นึ่��เสนึ่อ interface ซึ่��งแที่%ที่��จรงแล%วัก9คุ�อล�กษณะของ Abstract Class ที่��ประกอบัไปด%วัย่สม�ชิกที่�กติ�วัเป4นึ่ abstract method หร�อ abstract property เที่��นึ่�&นึ่

• C# ไม�สนึ่�บัสนึ่�นึ่ก�รที่�� multiple inheritance แติ�เร�ส�ม�รถุเล�ย่นึ่แบับัก�รกระที่��ด�งกล��วัโดย่อ�ศั�ย่ก�รใชิ% interface (ซึ่��งม�จ�ดด%อย่กวั��ก�รที่�� multiple inheritance ในึ่ C++ ติรงที่��เร�จะติ%องนึ่ย่�ม เมธ์อดที่��กล��วัไวั%ในึ่อนึ่เที่อร-เฟัส ในึ่คุล�สส�บัที่อดที่�กติ�วั ส�วันึ่ในึ่ C++ ไม�ติ%องกระที่��เชิ�นึ่นึ่�&)

• ส�ดที่%�ย่ เร�ได%เร�ย่นึ่ร(%ก�รนึ่ย่�มอนึ่เที่อร-เฟัสในึ่ร(ปแบับัติ��งๆ และก�รเร�ย่กใชิ%เมธ์อดของอนึ่สแตินึ่ติ-ที่��นึ่ย่�มภ�ย่ใติ%อนึ่เที่อร-เฟัสในึ่ล�กษณะติ��งๆ ก�นึ่

• อนึ่เที่อร-เฟัส นึ่ย่มใชิ%เพั��อนึ่ย่�มคุ�ณสมบั�ติร�วัมที่��ม�กจะม�ในึ่ล�กษณะข%�มคุวั�มส�มพั�นึ่ธ์-ที่��ไม�ใชิ� generalization abstraction แบับัส�ย่ติรง ซึ่��งติ�มปกติจะใชิ%ก�รที่�� inheritance ธ์รรมด�