[C#]Unit 6 OOP

Unit 6 OOP

bot2.gif Intro

Object Oriented Programming เป็นการเขียนโปรแกรมเชิงวัตถุ โดย ออบเจ็กต์นี้จะประกอบด้วยคุณสมบัติประจำตัวของออบเจ็กต์ที่เรียกว่า ” Property” และพฤติกรรมหรือที่เรียกว่า “Method” ซึ่งองค์ประกอบเหล่านี้เราจะกำหนดผ่าน Class นั่นเอง ดังนั้นการสร้างออบเจ็กต์จึงต้องเริ่มที่การสร้าง Class ก่อน เพื่อกำหนดโครงสร้างต่างๆ ของออบเจ็กต์นั้น

bot2.gif การสร้าง Object จาก Class

ในการสร้างออบเจ๊กต์จากคลาสนั้นเราเริ่มด้วยการสร้างตัวอ้างอิงของคลาสที่เรียกว่า “Instance” ก่อน โดย อินสแตนซ์นี้จะเป็นชื่อที่เราต้องการกำหนดให้กับออบเจ็กต์นั่นเอง ขั้นตอนการสร้่างอินสแตนซ์นี้เราเรียกว่า “Instantiation” วิธีการทำมีดังนี้

1. กำหนด InstanceName

รูปแบบของคำสั่ง

ตัวอย่าง

className InstanceName circle myCircle;

2.นำอินสแตนซ์ที่ได้มาสร้างเป็นออบเจ็กต์ด้วยรูปแบบดังนี้

รูปแบบของคำสั่ง

ตัวอย่าง

InstanceName = new className(argument); myCircle = new circle();

หรือสามารถรวบเหลือขั้นตอนเดียวเลยก็ได้

รูปแบบของคำสั่ง

ตัวอย่าง

className InstanceName = new className(argument); circle myCircle = new circle();

3. ตอนนี้เราได้ออบเจ๊กต์ myCircle ซึ่งมีองค์ประกอบต่างๆ ตามที่ระบุไว้ในคลาส circle ทุกประการ หากเราต้องการเรียกใช้องค์ประกอบใดของคลาส ให้ทำดังนี้

รูปแบบของคำสั่ง

ตัวอย่าง

InstanceName.xxx // xxx = method,property,data myCircle.Radius;

bot2.gifConstructor

ในการสร้างออบเจ็กต์จากคลาส ในบางกรณีเราจำเป็นต้องกำหนดค่าบางอย่างที่จำเป็นในการเรียกใช้งานเบื้องต้น เราสามารถกำหนดค่าเหล่านี้ไส้ในเมธอดพิเศษที่เรียกว่า “Constructor” โดยมีข้อกำหนดดังนี้
– ชื่อของ Constructor ต้องเป็นชื่อเดียวกับคลาส
– เราสามารถกำหนดให้มี constructor ชื่อเดียวกันไ้ด้หลายตัวในคลาสเดียวกัน สำหรับการรับค่าอาร์กิวเมนต์ที่ต่างกัน ซึ่งก็คือการทำ Overloading นั่นเอง
– สามารถกำหนด modifier ให้กับเมธอดได้เพียงระดับ public หรือไม่กำหนดอะไรเลย
– constructor ไม่มีการส่งค่ากลับ แต่ ไม่ต้องระบุ void นำหน้า constructor นั้นเหมือนเมธอดทั่วไป
– constructor ไม่สามารถเรียกใช้งานได้เหมือนเมธอดอื่นๆ ทำได้เพียงการผ่านค่าให้มันในขั้นตอนการสร้างออบเจ็กต์เท่านั้น

ตัวอย่างการสร้าง constructor ให้กับคลาส circle

class circle

{

double radius;

public circle(double r) // constructor สำหรับรับค่าที่เป็น double กรณีผู้ใช้กำหนดค่าเริ่มต้นให้กับออบเจ็กต์

{

radius = r;

}

public circle()

{

radius = 1;

}

}

ในการผ่านค่าอาร์กิวเมนต์ เข้ามาให้ constructor ในขั้นตอนการสร้างออบเจ็กต์ เราสามารถทำได้ดังนี้

circle myCircle = new circle(10.0);

bot2.gif Class Variable และ Instance Variable

โดยทั่วไปตัวแปรที่เรากำหนดในคลาสใดๆ เมื่อเรานำคลาสนั้นไปสร้างเป็นออบเจ็กต์ หากเราเปลี่ยนแปลงค่าของตัวแปรที่ออบเจ็กต์ใด จะไม่ส่งผลถึงค่าตัวแปรตัวนั้นที่ออบเจ็กต์อื่น (ที่สร้างมาจากคลาสเดียวกัน) เราเรียกตัวแปรแบบนี้ว่า instance variable

แต่หากเราต้องการให้ทุกออบเจ็กต์ที่สร้างมาจากคลาสเดียวกันนี้อ้างอิงข้อมูลบางอย่างเหมือนกัน หรือ อ้างอิงข้อมูลค่าเดียวกัน เมื่อเราทำการเปลี่ยนค่าของข้อมูลตัวนั้นที่ออบเจ็กต์ใด จะส่งผลให้ค่าของข้อมูลนั้นที่ออบเจ็กต์ตัวอื่นเปลี่ยนตามไปด้วย เราต้องกำหนดให้ modifier ของตัวแปรนั้นเป็นแบบ static ซึ่งเราเรียกตัวแปรแบบนี้ว่า class variable

bot2.gifInstance Method และ Class Method

Instance Method คือเมธอดทั่วๆไป ที่เราต้องเรียใช้งานผ่านอินสแตนซ์เท่านั้น

Class Method นั้นหมายถึงคลาสที่เีราสามารถเรียกใช้งานผ่านคลาสนั้นได้โดยตรงเลย โดยไม่ต้องสร้างอินสแตนซ์ของคลาสนั้นก่อนด้วยการกำหนด modifier ของเมธอดนั้นเป็นแบบ static เท่านั้นเอง

bot2.gifการผ่านค่าในรูปแบบของ Object

รูปแบบการผ่านค่าในรูปแบบของออบเจ็กต์ นั้นคล้ายกับการผ่านค่าของตัวแปรทั่วไป แต่มีรายละเอียดบางอย่างที่แตกต่างกันออกไป เช่น ต้องการผ่าน object myCircle ไปยังเมธอด circlrInfo โดยสมมุติว่า Circle คือคลาสที่เราได้สร้างเอาไว้แล้ว

class TestPassObject

{

public static void Main()

{

Circle myCircle = new Ccircle(10.0); //สร้างออบเจ็กต์ MyCircle รัศมี 10

circleInfo(myCircle); // ผ่านออบเจ็กต์ myCircle ไปยังเมธอด CircleInfo

}

public static void circleInfo(Circle c)

{

Console.WriteLine(“Radius of circle is {0},Area is {1}”,c.Radius,c.Area);

}

}

NOTE : ในการผ่านค่าออบเจ็กต์เป็นการผ่านแบบ Reference หากเรา้ต้องการให้เกิดการเปลี่ยนแปลงเฉพาะในส่วนนั้น โดยไม่มีผลต่อส่วนอื่่นๆ สามารถกำหนด Modifier แบบ private ให้กับข้อมูล

bot2.gifการใช้ is และ as

  • is >> ใช้ในการตรวจสอบว่าออบเจ็กต์ที่ระบุเป็นคลาสชนิดนั้น หรือไม่ โดยค่าที่ได้กลับมาจะเป็น true หรือ false

    รูปแบบของคำสั่ง

    ตัวอย่าง

    object is Class MyCircle is circle
  • as >> ใช้ในการเปลี่ยนออบเจ็กต์ชนิดหนึ่งไปเป็นอีกชนิดหนึ่ง หากเปลี่ยนไม่ได้ค่าที่ได้จะเป็น null แทนที่จะเกิดข้อผิดพลาด

    รูปแบบของคำสั่ง

    ตัวอย่าง

    object1 as object2 myObject1 as myObject2

bot2.gifInheritance

คุณสมบัติที่สำคัญของการเขียนโปรแกรมแบบ OOP ก็คือ สามารถสืบทอดจากคลาสหนึ่งไปสู่อีกคลา่สหนึ่งได้ นอกจากจะสืบทอดไปแล้ว เรายังสามารถเพิ่มเติมหรือปรับปรุงเปลี่ยนแปลงเมธอดต่างๆ ที่อยู่ในคลาสเดิมให้เป็นแบบตามที่เราต้องการได้

– คลาสต้นแบบที่เราจะทำการสืบทอดไปสู่คลาสอื่นเราเรียกว่า “base class”
– คลาสที่ใหม่ที่ได้จากการสืบทอดไป เราเรียกว่า “derived class” ซึ่งโดยทั่วไปแล้ว derived class มักจะมีรายละเีอียดหรือความสามารถมากกว่า base class เพราะการเพิ่มเติมความสามารถใหม่นอกเหนือจากที่มีแล้วใน base class นั่นเอง
-การกำหนดให้มีการสืบทอดเราจะใช้สัญลักษณ์ : เป็นตัวบอกว่าคลาสนี้สืบทอดมาจากคลาสไหน เช่น

class B:A;

class A

{

….

}

class B:A

{

….

}

bot2.gif การใช้คีย์เวิร์ด this และ base

this >> ใช้ในการอ้างถึงคลาสปัจจุบันที่เรากำลังใช้งานอยู่ เช่น กรณีที่ต้องการเรียก constructor ของคลาสสามารถทำได้ดังนี้

public class Figure

{

private double weight, volume;

public Figure()

{

this.volume = 1.0;

this.weight = 1.0;

}

}

ในกรณีที่มีการสืบทอดระหว่างคลาส หากคลาสที่สืบทอด(Derived class) ต้องการอ้างถึง Base Class ต้องใช้คำว่า base แทน เช่น

class A

{

….

public int x;

….

}

class B:A

{

….

base.x =10;

….

}

bot2.gif Private and Protected

  • private >> เป็น modifier ใช้ในกรณีที่เราไม่ต้องการให้คลาสอื่นๆ สามารถมองเห็นหรือใช้งานองค์ประกอบนั้นๆ ของคลาสได้แม้ว่าจะสืบทอดกันมาก็ตาม
  • protected >> ใช้ในกรณีที่เราต้องการจะปกป้องข้อมูลต่างๆ ภายในคลาสไม่ให้สามารถเรียกใช้งานจากคลาสอื่นได้ ยกเว้นภายในคลาสของเราเอง และคลาสที่สืบทอดไปจากคลาสนี้เท่านั้น เป็นการป้องกันสมาชิกภายในคลาสไม่ให้คลาสอื่นๆ ที่ไม่อยู่ในลำดับชั้นการสืบทอดเดียวกันเข้ามาในข้อมูล

bot2.gifNested Class

เราเรียกคลาส B ว่า nested class เนื่องจากถูกวางไว้ใน container class A ในการอ้างอิง nested class เราต้องระบุทั้ง container class และ nested class คล้ายๆกับเป็นเมธอดย่อยๆหนึ่ง เช่น หากเราต้องการสร้าง instance ของ nested class “N” ซึ่งอยู่ใน container “C” เราต้องระบุดังนี้

C.N n = new C.N();

เราสามารถใช้ nested class นี้เป็นทางผ่านในการเข้าถึง member ที่กำหนด modifier แบบ private และ protected

Leave a comment