วันอังคารที่ 10 พฤศจิกายน พ.ศ. 2558

Polymorphism

Polymorphism


โพลิมอร์ฟิซึม (Polymorphism)
                ประโยชน์ สำคัญของกลไกลโพลิมอร์ฟิซึม  คือการนำกลับมาใช้ใหม่ (reuse) โปรแกรมที่เราออกแบบไว้ ในปัจจุบันสามารถรองรับคลาสใหม่ๆได้ ที่จะถูกเขียนเพิ่มในอานาคต ได้   ทั้งนี้เพราะวัตถุในคลาสใหม่ๆ  จะถูกใช้งานผ่านทางเรพเฟอร์เรนซ์ของคลาสพื้นฐาน 
                

                ส.นอน () สามารถตีความหมายได้หลายแบบ ขึ้นกับวัตถุที่  ส   อ้างถึง
                โปรแกรม แสดง เมธอด นอน ()
                สัตว์ ส ;
                ส = new   สัตว์ ();
                ส.นอน();
                = new   ลิง ();
                ส.นอน();
                = new  ปลา ();
                ส.นอน();



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

Class  คนเลี้ยงสัตว์
             ให้อาหาร (สัตว์ ) {
                 ส.กิน();
   }
}

 คนเลี้ยงสัตว์  ค =  new คนเลี้ยงสัตว์();
ลิง   ล  =  new  ลิง();
อีกัวน่า  อ  =  new  อีกัวน่า();
ค. ให้อาหาร(ล) ;
ค.ให้อาหาร (อ) ;

            
                                  ภาพ การสืบทอดคลาสสัตว์ที่เป็นคลาสลูก 


ตัวอย่าง ที่1
1     1. คลาสภาพร่างเขียนไว้
Public   class   Shape{
                Public   double getArea(){rrturn 0 ;}
}
นอกจากนี้แล้วภาพร่างยังมีสีตามที่ประกาศไว้ใน อีนัม color
 public   class   Shape{
                private Color color;
                public   Shape(){
                                Color = Color.Red;
                }
                public   void  setColor(Color  c) {
                                Color = c ;
                }
                public Color  getColor(){
                                Return  color;
                }
                public  double getColorArea(){
                                Return 0 ;
                }

     }

1    2. ทดสอบคลาสภาพร่าง
  คลาส TestShape ใช้ทดสอบการทำงานของคลาส  Shape  โดยจะเรียกใช้ทุกเมธอด ในคลาส Shape ในการทดสอบมีขั้นตอนคือ

1.1            สร้างภาพร่าง  พิมพ์สี  และพิมพ์พื้นที่
1.2             สร้างภาพร่างอีกภาพ  เปลี่ยนเป็นสีน้ำเงิน  พิมพ์สี   และพิมพ์พื้นที่
       
public   class  TestShape
        public  static void  main (String[]args){
                        Shape s1 =  new  Shape {
                        System.out.println(s1.getColor());
                        System.out.println(s1.getArea());
                        Shape s2 = new  Shape();

                        S2.setColor(Color.Blue);
                        System.out.println(s2.getColor());
                        System.out.println(s2.getArea());
        }
}

ผลการรันโปรแกรมคือ
Red
0.0
Blue
0.0
                        

ตัวอย่าง 2 TestEmployee.java
package ems.test;

import ems.model.Employee;
import ems.model.Manager;

public class TestEmployee {

                 public static void main(String[] args) {

                 Employee[] empList = new Employee[10];

                  Employee emp1 = new Employee();
                  emp1.setId(1);
    emp1.setName("James");
    emp1.setSalary(15000);
                  emp1.getAddress().setStreet("Rama 3");
    emp1.getAddress().setCity("Bangkok");
    empList[0] = emp1;

                  Employee emp2 = new Employee();
                  emp2.setId(2);
    emp2.setName("Ann");
                   emp2.setSalary(25000);
   emp2.getAddress().setStreet("Silom");
    emp2.getAddress().setCity("Bangkok");
    empList[1] = emp2;

    Manager emp3 = new Manager();
    emp3.setId(3);
    emp3.setName("Peter");
    emp3.setSalary(40000);
    emp3.getAddress().setStreet("Bangrak");
    emp3.getAddress().setCity("Bangkok");
    emp3.setParkingNo("4C-19");
    empList[2] = emp3;
    // because empList will hold address of Employee
    // And Manager is-an Employee. Therefore it's fine

    for (int i = 0; i < empList.length; i++) {
      if (empList[i] != null) {
        System.out.println(empList[i].getDetails());
      } else {
        break;
      }
    }

  } // end of main()

} // end class


ผลการรันโปรแกรมได้ดังนี้
1, James, 15000.0, Rama 3, Bangkok
2, Ann, 25000.0, Silom, Bangkok
3, Peter, 40000.0, Bangrak, Bangkok, [Parking No: 4C-19]

ตัวอย่างที่3
class Overload
{
    void demo (int a)
    {
       System.out.println ("a: " + a);
    }
    void demo (int a, int b)
    {
       System.out.println ("a and b: " + a + "," + b);
    }
    double demo(double a) {
       System.out.println("double a: " + a);
       return a*a;
    }
}
class MethodOverloading
{
    public static void main (String args [])
    {
        Overload Obj = new Overload();
        double result;
        Obj .demo(10);
        Obj .demo(10, 20);
        result = Obj .demo(5.5);
        System.out.println("O/P : " + result);
    }
}


ผลการรันโปรแกรมที่ได้ คือ
a: 10
a and b: 10,20
double a: 5.5
O/P : 30.25          

ตัวอย่างที่ 4
public class BaseClass
{
    public void methodToOverride() //Base class method
    {
         System.out.println ("I'm the method of BaseClass");
    }
}
public class DerivedClass extends BaseClass
{
    public void methodToOverride() //Derived Class method
    {
         System.out.println ("I'm the method of DerivedClass");
    }
}

public class TestMethod
{
     public static void main (String args []) {
        // BaseClass reference and object
        BaseClass obj1 = new BaseClass();
        // BaseClass reference but DerivedClass object
        BaseClass obj2 = new DerivedClass();
        // Calls the method from BaseClass class
        obj1.methodToOverride();
        //Calls the method from DerivedClass class
        obj2.methodToOverride();
     }
}


ผลการรันโปรแกรทที่ได้ คือ
.
I'm the method of BaseClass
I'm the method of DerivedClass


ตัวอย่างที่5
class Vehicle {
    public void move () {
         System.out.println ("Vehicles are used for moving from one place to another ");
    }
}

class Car extends Vehicle {
    public void move () {
      super. move (); // invokes the super class method
      System.out.println ("Car is a good medium of transport ");
    }
}

public class TestCar {
    public static void main (String args []){
        Vehicle b = new Car (); // Vehicle reference but Car object
        b.move (); //Calls the method in Car class
    }
}

ผลการรันโปรแกรทที่ได้ คือ

Vehicles are used for moving from one place to another
Car is a good medium of transport




inheritance

inheritance

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

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

 class  สัตว์ {
  // แอตทริบิวต์
อายุ ;
ความหิว ;
// เมธอด 
กิน() {...}
นอน() {...}

หลังจากนั้น เราจะสามารถทำการเชื่มต่อคลาส เเมว ปลาเเละลิงกับคลาสสัตว์ โดยอาศัยกลไกลของการสืบทอด  การสืบทอดในภาษาไทยปนภาษา จาวา ใช้คำว่า extends  (ภาษา จาวา ก็ใช้extends เหมือนกัน ) การสืบทอดมีภาพเเบบดังนี้

ภาพเเบบ
class คลาสลูก extends คลาสเเม่
ตัวอย่างเช่น 

class เเมว extends  สัตว์ {
}
classปลา extends สัตว์ {
}
classลิง extends สัตว์{
}


เรื่องเกี่ยวกับการ Inheritance 
เรื่องเกี่ยวกับการ Inheritance จะมีส่วนประกอบหลายส่วนประกอบกันที่คุณต้องทำความรู้จักดังนี้
  • SuperClass  เป็นคลาสที่เป็นต้นแบบให้คลาสอื่นสืบทอดคุณสมบัติ
  • SubClass  เป็นคลาสที่สืบทอดคุณสมบัติจากคลาสอื่น
  • FinalClass  คลาสที่ไม่ยอมให้คลาสอื่นสืบทอดคุณสมบัติ
  • Override method  การปรับเปลี่ยนคุณสมบัติของเมธอดในคลาสลูกให้ต่างจากคลาสแม่
 SuperClass และ SubClass
  • SuperClass เรียกง่ายๆ ว่า คลาสแม่ เป็นคลาสที่เป็นต้นแบบให้คลาสอื่นสืบทอดคุณลักษณะ เช่นคลาส Animal เป็น SuperClass ของคลาส Lion, คลาส elephant, คลาส Tiger, คลาส Dog และคลาส Cat
  • SubClass เรียกง่ายๆ ว่า คลาสลูก เป็นคลาสที่สืบทอดคุณลักษณะ (ทั้งแอตทริบิวต์ และเมธอด)



ตัวอย่างสืบทอดไปสู่ SubClass ได้บ้าง

ตัวอย่าง 1

pulic class inheritUsing{
public static void main (String[]args){
Father ada = nwe Father();
String strIn = dad.ShowFather();
System.out.println(strIn);
son child =new Son();
strIn = child.ShowSon();
System.out.println(strIn);
strIn = child.ShowFather();
System.out.println(strIn);
}
      }

class Father{
private int f1;
String ShowFather()
{
   f1=(int) (Math.random()*10)+30;
   return "class Father : age =" + f1;
  }
}

class  Son  extends Father
private int s1;
String ShowSon()
{
s1 = (int)(Math.random()*10);
return "class Son : age =" +s1;
   }
}


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

ตัวออย่าง 2

Public   class InheritOverride{
                public static void main(String[]args){
                                Parent  dadmom = new Parent();
                                System.out.println(dadmom.Show());
                                Child   kid = new Child();
                                System.out.println(kid.Show ());
                }
}
Class   Parent {
                Private   int   px;
                String   Show(){
                                Px = (int)(Math.random()*100);
                                Return  “px = ”+ px;
                }
}
Class Child extends Parent {
                Private int cx;   
                String   Show() {
                                Cx = (int)(Math.random()*100)-200;                       
                                Return “cx = ” + cx;
                }
}



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

ตัวอย่าง  3

Final   class  Dinosaur  {
                public  int  Weinght = 5000l;
                String   Show () {
                                Return “I  am Dinosaur.  Wiegt =” + “kg”;
                }
}

Class  Reptile  {
                public   int   Weight = 30;
                final   String   ShowReptile(){
                                return “I  am  reptile.  Weight = ”+  Weight + “ kg ”;
                }
}
                

ตัวอย่างที่ 4
class Calculation{
   int z;
   public void addition(int x, int y){
      z=x+y;
      System.out.println("The sum of the given numbers:"+z);
   }
   public void Substraction(int x,int y){
      z=x-y;
      System.out.println("The difference between the given numbers:"+z);
   }
  
}

public class My_Calculation extends Calculation{   
 
   public void multiplication(int x, int y){
      z=x*y;
      System.out.println("The product of the given numbers:"+z);
   }
   public static void main(String args[]){
      int a=20, b=10;
      My_Calculation demo = new My_Calculation();
      demo.addition(a, b);
      demo.Substraction(a, b);
      demo.multiplication(a, b);     
     
   }


}


Compile and execute the above code as shown below

javac My_Calculation.java
java My_Calculation
After executing the program it will produce the following result.

The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200


วันจันทร์ที่ 9 พฤศจิกายน พ.ศ. 2558

Encapsulation

ตัวอย่างโค๊ต java

Encapsulation  ก็คือ รวม data และ method ทั้งหลายที่เกี่ยวข้องกัน และทำงานร่วมกันเอาไว้ใน object หนึ่งๆ นอกจากนี้แล้วยังมีการซ่อนรายละเอียดของการทำงานของ method ต่างๆใน object เอาไว้ และไม่ให้ object อื่นๆสามารถที่จะเข้าไปแก้ไข data ได้โดยตรง การติดต่อสื่อสารกันระหว่าง object จะติดต่อกันผ่าน interface ที่กำหนดเอาไว้ ซึ่งตรงนี้จะก่อให้เกิดความสะดวกในการจัดการโค้ดต่างๆครับ เช่นถ้าเราเปลี่ยนลักษณะการเขียนโค้ดใน class ที่ encapsule เอาไว้ การเปลี่ยนของเราจะไม่ไปกระทบกับ class อื่นๆ

ตัวอย่าง 1 class ที่มี encapsule


public class Test{
   private int data = 10;  


  public void setData(int data){  
       this.data = data;
   }


  public int getData(){  
       data = doSomthing();
       return data;
   }


   private int doSomething(){  
       data = data * 5;
       return data;
   }


จากโค้ดข้างบน method doSomething() ให้เป็น public

public class Test{

   private int data = 10;   

  

  public void setData(int data){ 

       this.data = data;

   }



  public int getData(){

       data = doSomthing();

       data = doAnotherThing();

       return data;

   }



   public int doSomething(){ 

     data = data * 5;

       return data;

   }



   public int doAnotherThing(){

       data = data + 5;

       return data;

    }
}  


ตัวอย่างที่ 2


public class EncapsulationDemo{
    private int ssn;
    private String empName;
    private int empAge;

    //Getter and Setter methods
    public int getEmpSSN(){
        return ssn;
    }

    public String getEmpName(){
        return empName;
    }

    public int getEmpAge(){
        return empAge;
    }

    public void setEmpAge(int newValue){
        empAge = newValue;
    }

    public void setEmpName(String newValue){
        empName = newValue;
    }

    public void setEmpSSN(int newValue){
        ssn = newValue;
    }
}
public class EncapsTest{
    public static void main(String args[]){
         EncapsulationDemo obj = new EncapsulationDemo();
         obj.setEmpName("Mario");
         obj.setEmpAge(32);
         obj.setEmpSSN(112233);
         System.out.println("Employee Name: " + obj.getEmpName());
         System.out.println("Employee SSN: " + obj.getEmpSSN());
         System.out.println("Employee Age: " + obj.getEmpAge());
    }

}

ผลการรันโปรแกรมที่ได้ คือ 
Employee Name: Mario
Employee SSN: 112233
Employee Age: 32

Moodle 19+Font TH

Moodle 19+Font TH ดาวโหลด ดาวโหลด