ผลต่างระหว่างรุ่นของ "คลาส (คอมพิวเตอร์)"

จากวิกิพีเดีย สารานุกรมเสรี
เนื้อหาที่ลบ เนื้อหาที่เพิ่ม
SieBot (คุย | ส่วนร่วม)
Octahedron80 (คุย | ส่วนร่วม)
บรรทัด 39: บรรทัด 39:
== ตัวอย่าง ==
== ตัวอย่าง ==
=== ภาษาซีชาร์ป ===
=== ภาษาซีชาร์ป ===
<source lang="csharp">
<font color="#0000c0"><b>public&nbsp;class&nbsp;</b></font><font color="#000000">Example&nbsp;</font><font color="#000000">{</font>
public class Example {
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>static&nbsp;</b></font><font color="#c00000"><b>void&nbsp;</b></font><font color="#000000">Main</font><font color="#000000">()&nbsp;{</font>
static void Main() {
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.Console.WriteLine</font><font color="#000000">(</font><font color="#990000">&#34;Hello,&nbsp;world!&#34;</font><font color="#000000">)</font><font color="#000000">;</font>
System.Console.WriteLine("Hello, world!");
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font>
}
<font color="#000000">}</font>
}
</source>


=== ภาษาจาวา ===
=== ภาษาจาวา ===
<source lang="java">
<font color="#0000c0"><b>public&nbsp;class&nbsp;</b></font><font color="#000000">Account&nbsp;</font><font color="#000000">{</font>
public class Account {
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>private&nbsp;</b></font><font color="#000000">String&nbsp;accountName;</font>
private String accountName;
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>private&nbsp;</b></font><font color="#000000">String&nbsp;accountNumber;</font>
private String accountNumber;
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>private&nbsp;</b></font><font color="#c00000"><b>double&nbsp;</b></font><font color="#000000">balance;</font>
private double balance;
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font>
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>public&nbsp;</b></font><font color="#c00000"><b>void&nbsp;</b></font><font color="#000000">deposit</font><font color="#000000">(</font><font color="#c00000"><b>double&nbsp;</b></font><font color="#000000">amount</font><font color="#000000">)&nbsp;{</font>
public void deposit(double amount) {
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">balance&nbsp;=&nbsp;balance&nbsp;+&nbsp;amount;</font>
balance = balance + amount;
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font>
}
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font>
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>public&nbsp;</b></font><font color="#c00000"><b>void&nbsp;</b></font><font color="#000000">withdraw</font><font color="#000000">(</font><font color="#c00000"><b>double&nbsp;</b></font><font color="#000000">amount</font><font color="#000000">)&nbsp;{</font>
public void withdraw(double amount) {
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">balance&nbsp;=&nbsp;balance&nbsp;-&nbsp;amount;</font>
balance = balance - amount;
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font>
}
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font>
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>public&nbsp;</b></font><font color="#000000">String&nbsp;getAccountName</font><font color="#000000">()&nbsp;{</font>
public String getAccountName() {
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>return&nbsp;</b></font><font color="#000000">accountName;</font>
return accountName;
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font>
}
<font color="#ffffff"></font>

<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>public&nbsp;</b></font><font color="#c00000"><b>void&nbsp;</b></font><font color="#000000">setAccountName</font><font color="#000000">(</font><font color="#000000">String&nbsp;name</font><font color="#000000">)&nbsp;{</font>
public void setAccountName(String name) {
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">accountName&nbsp;=&nbsp;name;</font>
accountName = name;
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font>
}
<font color="#ffffff"></font>

<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>public&nbsp;</b></font><font color="#000000">String&nbsp;getAccountNumber</font><font color="#000000">()&nbsp;{</font>
public String getAccountNumber() {
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>return&nbsp;</b></font><font color="#000000">accountNumber;</font>
return accountNumber;
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font>
}
<font color="#ffffff"></font>

<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>public&nbsp;</b></font><font color="#c00000"><b>void&nbsp;</b></font><font color="#000000">setAccountNumber</font><font color="#000000">(</font><font color="#000000">String&nbsp;number</font><font color="#000000">)&nbsp;{</font>
public void setAccountNumber(String number) {
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">accountNumber&nbsp;=&nbsp;number;</font>
accountNumber = number;
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font>
}
<font color="#ffffff"></font>

<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>public&nbsp;</b></font><font color="#c00000"><b>double&nbsp;</b></font><font color="#000000">getBalance</font><font color="#000000">()&nbsp;{</font>
public double getBalance() {
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>return&nbsp;</b></font><font color="#000000">balance;</font>
return balance;
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font>
}
<font color="#ffffff"></font>

<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000c0"><b>public&nbsp;</b></font><font color="#c00000"><b>void&nbsp;</b></font><font color="#000000">setBalance</font><font color="#000000">(</font><font color="#c00000"><b>double&nbsp;</b></font><font color="#000000">amount</font><font color="#000000">)&nbsp;{</font>
public void setBalance(double amount) {
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">balance&nbsp;=&nbsp;amount;</font>
balance = amount;
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font>
}
<font color="#000000">}</font>
}
</source>


[[หมวดหมู่:การเขียนโปรแกรม]]
[[หมวดหมู่:การเขียนโปรแกรม]]

รุ่นแก้ไขเมื่อ 08:51, 16 กรกฎาคม 2550

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

องค์ประกอบของคลาสมีสองส่วนหลักได้แก่

  1. ข้อมูล (data) หรือ คุณสมบัติ (property) สำหรับเก็บข้อมูลในการทำงานหรือบอกสถานะปัจจุบันของอ็อบเจกต์ ตัวอย่างเช่น คลาสชนิดบัญชีธนาคารสามารถมีข้อมูลคือ เลขที่บัญชี, ชื่อเจ้าของบัญชี, และยอดเงินปัจจุบัน
  2. พฤติกรรมการทำงาน (method หรือ function) เป็นส่วนรับคำสั่งและทำงานตามคำสั่งนั้น เช่นคลาสบัญชีธนาคารจากตัวอย่างข้างบนอาจจะมีฟังก์ชันสำหรับฝากและถอนเงินจากบัญชี เป็นต้น

นอกจากนี้ คลาสยังสามารถมีฟังก์ชันพิเศษเรียกว่า constructor ซึ่งจะถูกเรียกใช้ในเวลาที่กำลังสร้างอ็อบเจกต์จากคลาสเพื่อตั้งค่าเริ่นต้นให้กับข้อมูลและคุณสมบัติของอ็อบเจกต์นั้น

โครงสร้างของคลาส ในแบบ UML

การจำกัดการเข้าถึง

เราสามารถจำกัดความสามารถในการเห็นและใช้งานของแต่ละสมาชิกของคลาสหรือแม้แต่ตัวคลาสเองจากโลกภายนอกได้ ผลที่ได้คือข้อมูลและการทำงานส่วนตัวของคลาสจะถูกซ่อนไว้ โลกภายนอกสามารถขอให้อ็อบเจกต์ทำงานผ่านฟังก์ชันสาธารณะเท่านั้นโดยที่ไม่มีความจำเป็นจะต้องรู้รายละเอียดการทำงานภายในของคลาสนั้น ซึ่งก็เข้าหลักการที่เรียกว่า Encapsulation นั่นเอง

สมาชิกส่วนตัว (private members) มีเพียงอ็อบเจกต์ของคลาสนั้นเท่านั้นที่สามารถเห็นและใช้งานสมาชิกเหล่านี้ได้ โลกภายนอกจะไม่มีทางรู้เลยว่าคลาสมีสมาชิกเหล่านี้อยู่

สมาชิกสาธารณะ (public members) โลกภายนอกสามารถเรียกใช้สมาชิกเหล่านี้ได้โดยไม่มีข้อจำกัด

สมาชิกคุ้มครอง (protected members) อยู่ระัหว่างแบบส่วนตัวกับสาธารณะ สามารถเรียกใช้ได้โดยคลาสนั้นเองและคลาสย่อยที่สร้างมาจากคลาสนั้น เท่านั้น

ความสัมพันธ์ระหว่างคลาส

  • คลาสมีคลาสอื่นเป็นส่วนประกอบ (has-a) เช่นคลาสบัญชีรถยนต์มีคลาสเครื่องยนต์เป็นส่วนประกอบอยู่ภายใน
  • คลาสหลักกับคลาสย่อย (is-a) เช่นคลาสรถยนต์เป็นคลาสหลักสามารถวิ่งได้ มีรถแข่งและรถบรรทุกเป็นคลาสย่อย ทั้งรถแข่งและรถบรรทุกเป็นรถยนต์ชนิดหนึ่งจึงสามารถวิ่งได้เช่นกัน เข้าหลักการ Inheritance แต่รถแข่งสามารถวิ่งได้เร็ว รถบรรทุกสามารถขนของได้มาก เป็นคุณสมบัติเพิ่มเติม

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

คลาสแบบพิเศษ

คลาสแบบ Abstract คือคลาสหลักที่จะต้องถูกซับคลาส ไม่สามารถสร้างอ็อบเจกต์โดยตรงจากคลาสนี้ได้ มีจุดมุ่งหมายเพื่อประกาศสมาชิกร่วมบางส่วนของคลาสย่อยแต่ยังไม่นิยามรายละเอียดการทำงาน ปล่อยให้เป็นหน้าที่ของคลาสย่อยที่จะนิยามวิธีการทำงานแตกต่างกันไปตามความมุ่งหมายพิเศษของแต่ละคลาสย่อย

Interface คือข้อตกลงว่าคลาสที่มีอินเตอร์เฟสชนิดนั้นๆ สามารถทำงานตามข้อตกลงที่นิยามไว้ในอินเตอร์เฟสได้

ลักษณะของคลาสที่ดี

  • ซ่อนข้อมูลและคุณสมบัติส่วนตัวของคลาสโดยตั้งค่าให้เป็น private โลกภายนอกสามารถเข้าถึงข้อมูลเหล่านี้ผ่านทางฟังก์ชันพิเศษที่จะมีการตรวจสอบความถูกต้องของข้อมูล
  • ตั้งค่าเริ่มต้นของข้อมูลและคุณสมบัติของคลาสเสมอ อ็อบเจกต์จะอยู่ในสถานะที่พร้อมถูกใช้งานทันที
  • แตกคลาสที่มีภาระมาก (responsibilities) ออกเป็นส่วนย่อยๆ และแบ่งความรับผิดชอบที่เฉพาะเจาะจงให้กับคลาสเล็กๆ เหล่านั้น คลาสที่ใหญ่เกินไปและทำงานหลายอย่างจะยากต่อการบำรุงรักษาและแก้ไข
  • ตั้งชื่อสมาชิกให้สัมพันธ์กับหน้าที่ของมันเพื่อบ่งบอกจุดมุ่งหมายที่แน่ชัด จะทำให้ง่ายต่อการแก้ไขโปรแกรมต่อไป

ตัวอย่าง

ภาษาซีชาร์ป

public class Example {
    static void Main() {
        System.Console.WriteLine("Hello, world!");
    }
}

ภาษาจาวา

public class Account {
    private String accountName;
    private String accountNumber;
    private double balance;
    
    public void deposit(double amount) {
        balance = balance + amount;
    }
    
    public void withdraw(double amount) {
        balance = balance - amount;
    }
    
    public String getAccountName() {
        return accountName;
    }

    public void setAccountName(String name) {
        accountName = name;
    }

    public String getAccountNumber() {
        return accountNumber;
    }

    public void setAccountNumber(String number) {
        accountNumber = number;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double amount) {
        balance = amount;
    }
}