2017年11月4日 星期六

Day2-6 Implements Interface 實作介面

1.2 Develop code that declares an interface.…

- 一份介面interface,就是一份合約contract
- 這個合約定義那些功能需要做,但不需要說明如何做
假設如下的interface:
public interface OperateCar {
    void turn();
    void changeLanes();
}

一個Class實作此Interface:

public class OperateBMW760i implements OperateCar{

    @Override
    public void turn() {
    }

    @Override
    public void changeLanes() {
    }
}
雖然實作內容為空,但Compile會通過。Compiler只保證程式有實作。
當Implements時,必須遵守和繼承Abstract class一樣的實作規範。規範如下:

  1. implement interface時,皆需要implement所有interface的method且必須為public
  2. 遵守所有override規則
      • overriding method不能擁有比original method更侷限的access modifier,但可以更鬆散
      • overriding method的parameters必須和original method的相同,如果不同就不叫做overriding,只是寫了一個新的method
      • overriding method的return type必須和original method的相同,或者是subtype (covariant return)
      • 只有當instance method有被subclass extends的時候才可以做overriding。意即,一個private,final,static的method都不能夠被overriding
      • 不論original method是否有宣告exception,overriding method可以拋出runtime exception(unchecked exception)
      • overriding method不能夠拋出新的checked exception,異常範圍也不可以更廣
      • 不論original method宣告了些異常,overriding method不需要宣告任何它不會拋出的exception。
      • 不能override final or static method
  3. 不需要宣告已經在interface method宣告的Exception handler
Abstract Class可以implements interface,且可以把實作的事項交給第一個concrete class實作。

public abstract class Car implements OperateCar {
}

因此第一個concrete class(Sedan)必須實作OperateCar interface的所有method及Car本身的abstract method
public class Swean extends Car implements OperateCar{
    @Override
    public void turn() {

    }
    @Override
    public void changeLanes() {

    }
    //其他Car需要實作的method
}

實作其他規範:

  1. 一個class只能extends一個class但是可以implements多個interfaces,如:

  2. public class MultipleInterfaces implements InterFaceOne, InterFaceTwo, InterFaceThree
  3. subClass定義是什麼,interface定義扮演的角色 Interfaces on the other hand are more direct definition of an 'action'. That's why most (if not all) the interfaces in Java ends with 'able' (Comprable, Serializable...). Basically, to sum it up, Use abstract classes when you have a class that A is kind of B and interface when A can do B.
  4. 一個interface能夠extends多個interfaces,而且不需要實作。而第一個實作InterFaceOne的concrete class則需要實作InterFaceOne, InterFaceTwo, InterFaceThree的abstract methods。這個範例是InterfaceOne擴充了InterfaceTwo,InterFaceThree的需求。(interface可以隨意擴充多個interface)

  5. public class MultipleInterfaces implements InterFaceOne, InterFaceTwo, InterFaceThree
以範例下結論:

 class Animal { } // OK
 class Adult implements Animal { } // No! class不能implements class
 interface Runable { } // OK
 interface Flyable { } // OK
 interface Walkable implements Runable { } // No! interface不能implements interface
 interface Feedable implements Animal { } // No! interface不能implements class
 interface Thinkable extends Animal { } // No! interface不 extends class
 interface Runable extends Walkable { } // OK. interface不能 extends interface
 class Baby extends Adult, Animal { } // No! class不能 extends 多個class
 class Baby implements Walkable, Runable { } // OK. class可以implements多個interface
 interface Walkable extends Runable, Thinkable { } // OK. interface可以extends多個interfaces
 class Baby extends Animal implements Thinkable { } // OK. class可以extends一個class及多個interfaces(extedns要在implements前面)

沒有留言:

張貼留言