object-oriented programs design and construction
Post on 02-Jan-2016
23 Views
Preview:
DESCRIPTION
TRANSCRIPT
Page 1
Object-Oriented Programs Design and Construction
#6: Dynamic Properties of Objects
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
Overloading
• ในภาษา C++/C# ได้นาเสนอหลั�กการของ redefinition ในลั�กษณะที่��ผู้�เข�ยนโปรแกรมจะสามารถน#ยามกระบวนการใหปฏิ#บ�ติ#อย(างเหมาะสมก�บขอม�ลัที่��ร�บมาได้
• การที่��กระบวนการหน)�งๆ (หร+อเมธอด้หน)�งๆ) ได้ถ�กน#ยามไวอย(างใด้อย(างหน)�งไวก(อนแลัว แติ(ย�งสามารถที่��จะน#ยามกระบวนการน�-นๆ ใหม((หร+อซ้ำ-าซ้ำอน เพื่+�อใหปฏิ#บ�ติ#)ก�บขอม�ลัประเภที่ใหม(ๆ เพื่+�อใหการติอบสนองติ(อขอม�ลัติ(างชน#ด้ก�น เก#ด้ผู้ลัติ(างก�นน�- เราเร�ยกกระบวนการด้�งกลั(าวว(า overloading
• เราสามารถกระที่า overloadingได้ก�บเมธอด้แลัะโอเปอร1เรเติอร1
Page 4
Function Overloading & Redefinition of Functions
• ก�รที่��ฟั6งก-ชิ�นึ่โอเวัอร-โหลดดง คุ�อก�รนึ่ย่�มเมธ์อดที่��ม�ชิ��อเด�ย่วัก�นึ่ แติ�ม�ก�รที่��ง�นึ่ที่��แติกติ��งไปจ�กเดม โดย่ให%ก�รที่��ง�นึ่ใหม�นึ่�& ม�ล�กษณะข�&นึ่ก�บัพั�ร�มเติอร-ที่��เร�นึ่ย่�มเมธ์อดนึ่�&นึ่ๆ
• ด�งนึ่�&นึ่ ก�รที่��เมธ์อดติ�วัใด(ที่��ม�ชิ��อซึ่�&�ก�นึ่ ) จะที่��ง�นึ่ ก9จะข�&นึ่อย่(�ก�บัพั�ร�มเติอร-ที่��เข%�ม�
• ก�รที่��โอเวัอร-โหลดดง ย่�งส�ม�รถุกระที่��ก�บัเมธ์อดที่��ส�บัที่อดม�ด%วัย่ก9ได% (ม�ก�รนึ่ย่�มเมธ์อดนึ่�&นึ่ไวั%แล%วัในึ่คุล�สแม� แติ�ก9ม�ก�รนึ่ย่�มซึ่�&�ซึ่%อนึ่ในึ่คุล�สล(ก)
• ในึ่กรณ�ที่��เร�ก��หนึ่ดชิ��อเมธ์อดและพั�ร�มเติอร-ซึ่�&�ก�นึ่ในึ่ระหวั��งคุล�สแม�และคุล�สล(ก ) เร�จะติ%องใส�คุ��สงวันึ่ new นึ่��ก�รนึ่ย่�มเมธ์อดในึ่คุล�สส�บัที่อด(คุล�สล(ก ) เพั��อบั�งบัอกวั��เมธ์อดด�งกล��วัได%ร�บัก�ร redefinition ส��หร�บัคุล�สล(ก
• ในึ่กรณ�ที่��เร�ก��หนึ่ดชิ��อเมธ์อดซึ่�&�ก�นึ่ในึ่คุล�สหล�กและคุล�สส�บัที่อด เร�ส�ม�รถุเจ�ะจงเร�ย่กเมธ์อดที่��นึ่ย่�มในึ่คุล�สแม�ได%โดย่ก�รใชิ% base เพั��ออ%�งถุ�งสม�ชิกในึ่คุล�สแม� และ this เพั��ออ%�งถุ�งสม�ชิกในึ่คุล�สส�บัที่อด
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
นึ่ย่�มคุร�&งแรกแบับัไม�ม�
พั�ร�มเติอร-
นึ่ย่�มซึ่�&�ซึ่%อนึ่ในึ่คุล�สส�บัที่อด ติ%อง
ม� 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
Operator Overloading
• นึ่อกจ�กก�รที่��โอเวัอร-โหลดดงก�บัเมธ์อดแล%วั เร�ย่�งส�ม�รถุกระที่��โอเวัอร-โหลดดงก�บัโอเปอร-เรเติอร-ได%ด%วัย่เชิ�นึ่ก�นึ่
• ก�รที่��โอเวัอร-โหลดดงก�บัโอเปอร-เรเติอร- ใชิ%เพั��อก�รนึ่ย่�มซึ่�&� (redefinition) ก�บักระบัวันึ่ก�รที่��กระที่��ก�บัออปเจ9คุติ-ชินึ่ดใดชินึ่ดหนึ่��งเป4นึ่ก�รเฉพั�ะ
• ใชิ%คุ��สงวันึ่ operator เพั��อบั�งบัอกก�รที่��โอเวัอร-โหลดดงก�บัโอเปอร-เรเติอร- และติ�มด%วัย่ติ�วัโอเปอร-เรเติอร-ที่��ติ%องก�รที่��โอเวัอร-โหลดดง ในึ่ก�รนึ่ย่�มเมธ์อดเพั��อกระที่��ก�รโอเวัอร-โหลดดง
• ก�รใชิ%ง�นึ่โอเปอร-เรเติอร-ที่��ได%ร�บัก�รโอเวัอร-โหลดดง ใชิ%ง�นึ่ในึ่ร(ปเหม�อนึ่เดม เพั�ย่งแติ�ใชิ%ก�บัติ�วัโอเปอร-แรนึ่ด-ที่��ม�ชินึ่ดสอดคุล%องก�บัที่��ได%นึ่ย่�มไวั%
• หม�ย่เหติ� ก�รนึ่ย่�มซึ่�&�ก�บักระบัวันึ่ก�รที่��กระที่��ก�บัออปเจ9คุติ-ที่��ม�ชินึ่ดพั�&นึ่ฐ�นึ่ก9กระที่��ได% แติ�ไม�คุวัรกระที่��เพัร�ะจะที่��ให%ผู้(%เข�ย่นึ่โปรแกรมคุนึ่อ��นึ่อ�จเกดคุวั�มส�บัสนึ่ติ�อโคุ%ดของเร�
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
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
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
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
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
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
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
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
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
Virtual Methods
• ขอกาหนด้เก��ยวก�บการใช new/virtual/override ระหว(างคลัาสหลั�กแลัะคลัาสส+บที่อด้– virtual ใชก�บคลัาสหลั�กติ�วฐานส5ด้– คลัาสที่��ส+บที่อด้ติ(อมาก��ที่อด้ ใช override ได้ติลัอด้– จากน�-นเป6น new ซ้ำ)�งจะม�อ�กก��ที่อด้ก7ได้
• ใหน�กศึ)กษาลัองด้�การส+บที่อด้ในลั�กษณะที่��คลัาสลั�กสองติ�วส+บที่อด้จากคลัาสแม(ร(วมก�น ลัองด้�ว(าเก#ด้ผู้ลัอย(างไร เม+�อเราใช virtual/override ในการน#ยามคลัาสติ(างๆด้�งกลั(าว
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
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
Polymorphism
• คุ�ณสมบั�ติ polymorphism คุ�อคุ�ณสมบั�ติที่��ก�รอ%�งถุ�งองคุ-ประกอบัหนึ่��งๆ ของวั�ติถุ� ส�ม�รถุแปรเปล��ย่นึ่ไปได%ติ�มสภ�พัก�รอ%�งถุ�งหร�อนึ่ย่�ม
• เร�ได%เห9นึ่จ�กหล�ย่กรณ�ด%วัย่ก�นึ่ ในึ่กรณ�แรก เร�จะเห9นึ่วั��เร�ส�ม�รถุนึ่ย่�มชิ��อเมธ์อดในึ่คุล�สส�บัที่อดซึ่�&�ก�บัคุล�สหล�ก(โดย่ม�ล�กษณะพั�ร�มเติอร-เหม�อนึ่ก�นึ่)ได%โดย่ก�รใชิ% new ประกอบัก�รนึ่ย่�มในึ่คุล�สส�บัที่อด (ซึ่��งก�รพัจ�รณ�วั��จะใชิ%เมธ์อดใดจะข�&นึ่อย่(�ก�บัชินึ่ดของ reference
• ในึ่กรณ�ถุ�ดม� เร�ใชิ% virtual/override เพั��อให%ผู้ลของก�รอ%�งเมธ์อด เป4นึ่ไปติ�มคุล�สติ%นึ่แบับัที่��นึ่��ม�ใชิ%สร%�งอนึ่สแตินึ่ติ- จะเห9นึ่วั�� แม%วั��เร�จะก��หนึ่ดชินึ่ดของ reference แติกติ��งก�นึ่ไปแติ�ก9จะไม�ม�ผู้ลติ�อกรณ�หล�งนึ่�&
• ติ�วัอย่��งติ�อม�ที่��นึ่��สนึ่ใจก9คุ�อ ก�รที่��เร�นึ่ย่�มชินึ่ดของ reference ด%วัย่คุล�สหล�ก และนึ่��ไปร�บัคุ�� reference ของอนึ่สแตินึ่ติ-ติ��งประเภที่ก�นึ่ไป (ที่��นึ่ย่�มเมธ์อดด%วัย่ virtual/override) เร�จะเห9นึ่วั��แม%วั��เร�เร�ย่กใชิ%เมธ์อดเด�ย่วัก�นึ่ แติ�ผู้ลที่��ออกม�นึ่�&นึ่จะแติกติ��งไปติ�มอนึ่สแตินึ่ติ-ที่��อ%�งถุ�ง
Page 21
Abstract Class• ในึ่ติ�วัอย่��งก�อนึ่หนึ่%� สมมติวั��เร�สร%�งคุล�ส ThaiUnknown ข�&นึ่ม�
ส�บัที่อดจ�กคุล�ส Thai โดย่ไม�นึ่ย่�มเมธ์อด Say() เม��อเร�สร%�งอนึ่สแตินึ่ติ-จ�กคุล�ส ThaiUnknown แล%วัเร�ย่กใชิ%เม ธ์อด Say() จะเที่��ก�บัไปเร�ย่กใชิ%เมธ์อด Say() ที่��ได%นึ่ย่�มเอ�ไวั%ในึ่คุล�ส Thai ซึ่��งเป4นึ่คุล�สหล�ก ซึ่��งเข%�ล�กษณะก�รส�บัที่อดติ�มปกติ
• แติ�ในึ่ก�รออกแบับัคุล�สในึ่บั�งกรณ� เร�ติ%องก�รก��หนึ่ดข�&นึ่ลอย่ๆ ถุ�งกระบัวันึ่ก�รที่��เป4นึ่ไปได%ไวั%ภ�ย่ใติ%คุล�สหล�ก แล%วัในึ่คุล�สส�บัที่อดติ��งๆ คุ�อย่ม�นึ่ย่�มร�ย่ละเอ�ย่ดกระบัวันึ่ก�รติ�อไป โดย่เร�ม��งหวั�งวั��เร�ไม�นึ่��เอ�คุล�สหล�กไปใชิ%สร%�งอนึ่สแตินึ่ติ-ใดๆ โดย่ติรง และหวั�งวั��จะให%ใชิ%คุล�สที่��ส�บัที่อดม�สร%�งอนึ่สแตินึ่ติ-เที่��นึ่�&นึ่ ก�รที่��เชิ�นึ่นึ่�&จะที่��ให%ก�รนึ่ย่�มกระบัวันึ่ก�รที่��ง�นึ่ในึ่เมธ์อดที่��ก��หนึ่ดไวั%ในึ่คุล�สหล�กนึ่�&นึ่ เปล��ประโย่ชินึ่-
• ในึ่ที่��นึ่�&เร�จะก��หนึ่ดเมธ์อดด�งกล��วัโดย่นึ่ย่�มไวั%แติ�ห�วัเมธ์อดโดย่ไม�นึ่ย่�มส�งอ��นึ่ใดที่��เป4นึ่ติ�วัเมธ์อด และใชิ%คุ��สงวันึ่ abstract ก��ก�บัเมธ์อดและคุล�สที่��ม�เมธ์อดด�งกล��วั เมธ์อดด�งกล��วัเร�ย่กวั�� Abstract method และคุล�สด�งกล��วัเร�ย่กวั�� Abstract Class
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
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
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
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
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
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
Interface
• ในกรณ�ที่��ม�การน#ยามเมธอด้ช+�อซ้ำ-าก�นจากติ(างอ#นเที่อร1เฟส เราสามารถกาหนด้ว(าจะเร�ยกเมธอด้ที่��ถ�กน#ยามจากอ#นเที่อร1เฟสแติ(ลัะติ�วได้โด้ยการอางช+�ออ#นเที่อร1เฟซ้ำกาก�บไวที่��เมธอด้ในคลัาสส+บที่อด้
• ในกรณ�ที่��ม�ช+�ออ#นเที่อร1เฟสกาก�บไวก�บเมธอด้ที่��เรากาลั�งน#ยาม ก7ไม(ติองใส(คาสงวน public กาก�บเมธอด้ที่��จะติองน#ยามรายลัะเอ�ยด้ไวอ�ก
• เวลัาเร�ยกใชงานเมธอด้ที่��ม�ช+�อซ้ำ-าก�น เราสามารถเจาะจงอ#นเที่อร1เฟสที่��ติองการโด้ยกรรมว#ธ� casting
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
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
อ%�งเมธ์อดที่��นึ่ย่�มไวั%ในึ่
อนึ่เที่อร-เฟัสด%วัย่วัธ์�ปกติ
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
Interface
• นอกจากกลัไกการใชงานอ#นเที่อร1เฟสในสองร�ปแบบที่��กลั(าวมาแลัว เราย�งสามารถน#ยามเมธอด้กลัางสาหร�บใชก�บอ#นสแตินติ1ใด้ๆ ที่��ม�ค5ณสมบ�ติ#ติามอ#นเที่อร1เฟสที่��ได้น#ยามไวภายใติคลัาส โด้ยกาหนด้เพื่#�มพื่าราม#เติอร1อ�กหน)�งติ�วในเมธอด้กลัางน�- ใหม�ชน#ด้เป6นอ#นเที่อร1เฟสที่��ติองการ แลัะเราส(งผู้(านค(า reference ของอ#นสแตินติ1ที่��ติองการเขาไปย�งอ#นเที่อร1เฟสน�-
• ในส(วนคาส��งการที่างานของเมธอด้กลัาง เราก7เขาถ)งเมธอด้ที่��น#ยามภายใติอ#นเที่อร1เฟสติามปกติ#
• การน#ยามในลั�กษณะน�- ที่าใหผู้�เข�ยนโปรแกรมสามารถปร�บปร5งพื่�ฒนาเมธอด้ที่��น#ยามภายใติอ#นเที่อร1เฟสได้สะด้วก ลัด้การผู้�กติ#ด้ก�บส(วนที่��เร�ยกใชเมธอด้
• ลัองด้�ติ�วอย(างติ(อไปน�-ว(าม�การน#ยามที่างานอย(างไร
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
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
Conclusion
• การโอเวอร1โหลัด้ด้#งกระที่าได้ก�บเมธอด้แลัะโอเปอร1เรเติอร1• กระบวนการโอเวอร1โหลัด้ด้#ง เป6นความสามารถพื่+-นฐานของ
ภาษาเช#ง OO ที่��นาเสนอค5ณสมบ�ติ# redefinition• Polymorphism ค+อการที่��เราสามารถน#ยามเมธอด้ช+�อ
เด้�ยวก�นพื่าราม#เติอร1เหม+อนก�น ใหม�กระบวนการที่างานที่��แติกติ(างก�นออกไป การที่��จะม�การเร�ยกใชกระบวนการใด้น�-น ข)-นอย�(ก�บกลัไกการเร�ยกใชแลัะการน#ยาม
• เราเห7นค5ณสมบ�ติ#ของ Polymorphism โด้ยการน#ยาม virtual method (การใช virtual/override/new) ซ้ำ)�งที่าใหเราสามารถน#ยามเมธอด้ที่��ม�ช+�อเด้�ยวก�น แติ(ม�กระบวนการที่างานที่��แติกติ(างก�นภายใติ อ#นสแตินติ1ที่��ม�แม(แบบจากคลัาสติ(างก�น (แติ(ม�การส+บที่อด้ร(วมก�น)
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
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 ธ์รรมด�
top related