2011年3月17日 星期四

漫談物件導向(九) - 介面

介面 (Interface)

介面的概念有點類似抽象類別,但介面內純粹只能有常數型別資料成員宣告及介面方法原型宣告 (沒有實作程式碼),所以介面資料成員只能宣告為public、static及final,而介面方法只能宣告為public及abstract。介面定義的語法如下:

public abstract interface interface-name [extends interface1, interface2, …]{
    public static final data-type data- members-name = values;  // 資料成員宣告
    public abstract data-type interface-methods();   // 類別方法宣告
}

下列程式碼宣告了ISHAPE介面

1.   public abstract interface ISHAPE {
2.       public static final float pi = 3.14F;
3.       public abstract float area();
4.       public abstract float perimeter();
5.       public abstract void showinfo();
6.   }

由於介面之定義、介面方法及資料成員宣告方式都已被嚴格規範修飾字,因此,ISHAPE介面也可簡化如下:

1.   interface ISHAPE {
2.       float pi = 3.14F;
3.       float area();
4.       float perimeter();
5.       void showinfo();
6.   }

另外,介面只能使用常數資料成員 (宣告的資料成員預設都會加上final修飾字),因此所有資料成員都必須給定資料值,同時不允許在程式中變更資料值。

介面與抽象類別之間還有一個差異點,介面之間允許多重繼承,但類別之間只能存在單一繼承。類別要實作介面時,必須在類別宣告別使用implements關鍵字,下圖說明類別與介面間的繼承關係。


以下CIRCLE類別實作ISHAPE介面,在CIRCLE類別中並未宣告pi資料成員,但卻可以使用pi,這是因為CIRCLE繼承了ISHAPE介面的pi資料成員。

1.    public class CIRCLE implements ISHAPE {
2.        private float radius;              // 資料成員
3.        public CIRCLE (float r) {   // 建構子
4.        radius = r;
5.        }
6.        public float area() {
7.           return pi*radius*radius;   // 實作圓面積計算
8.        }
9.        public float perimeter() {
10.          return 2*pi*radius;         // 實作圓周長計算
11.     }
12.     public void showinfo() {
13.         System.out.println ("This is a circle");
14.     }
15.  }