Skip to content

Instantly share code, notes, and snippets.

@HabaCo
Created June 4, 2014 14:40
Show Gist options
  • Save HabaCo/16d75174c5b152cd1a76 to your computer and use it in GitHub Desktop.
Save HabaCo/16d75174c5b152cd1a76 to your computer and use it in GitHub Desktop.
Abstract Class(抽像類別),Interface(介面or接口)
Abstract Class(抽像類別),Interface(介面or接口)
Abstract Class(抽像類別):
----------------------------------------------------------------------------------------
[1]...顧名思義因為是抽象,所以無法產生(new)物件
abstract class AbClass{
-- aaa() 是有明確定義的方法
void aaa(){
// method here
}
-- bbb()、ccc() 是一個抽象(未實作內容)方法
abstract void bbb();
abstract void ccc();
-- 題外話:其實就是 pure virtual function(純虛擬函數)
}
[2]...abstract class抽像類別與class一般類別之間的繼承使用【extends】
而繼承抽像類別的子類別必須要把抽象方法實作出來:
class SubClass extends AbClass{
void bbb(){
// method here
}
void ccc(){
// method here
}
}
[3]...類別裡只要有任何一個(以上)方法未定義即為抽像類別,且修飾子為 abstract --> abstract void fun();
否則只要有其中之一的方法是 abstract 則繼承下來的類別也就還是抽像類別:
abstract class SubClass extends AbClass{
void bbb(){
// method here
}
// void ccc() 未實作
}
[4]...雖然無法產生物件可以接受多型透過子類別產生物件 --> (abstract)Father f = new (Subclass)Son();
雖然抽像類別無法產生(new)物件但可以透過多型達到
void main(){
AbClass ab = new SubClass();
}
========================================================================================
Interface(介面):
----------------------------------------------------------------------------------------
[1]...(介面)其實就是全部方法都是 abstract(抽像) 的一種類別,預設修飾子就是 abstract
可以省略 abstract 修飾子,若加上意思也相同
(abstract) interface InterfaceAA{
(abstract) void m1(int a);
(abstract) void m2(float b);
(abstract) void dd(double c);
}
interface InterfaceBB{
void m3(byte d);
void m4(short e);
void dd(double c);
}
[2]...(介面)與(介面)之間的繼承關係使用 extends 關鍵字,並且可以多重繼承
interface InterfaceCC extends InterfaceAA, InterfaceBB{
}
[3]...(介面)與(類別)(包括抽像類別)之間的繼承關係則使用 implements 關鍵字,也可以多重繼承
class SubClass implements InterfaceAA, InterfaceBB, InterfaceCC{
}
[4]...implements顧名思義是實作(介面),而(介面)與(抽像類別)在ㄧ般類別繼承上有點不同,一旦(介面)被繼承就必須實作所有的方法,否則不允許
而雖然在 InterfaceAA 和 InterfaceBB 有共同名稱且同參數的方法,但是會在類別繼承時實作出來,以實作出來的為主,因為覆寫(override)
class SubClass implements InterfaceCC{
void m1(int a){
// method here
}
void m2(float b){
// method here
}
void m3(byte d){
// method here
}
void m4(short e){
// method here
}
-- InterfaceAA 和 InterfaceBB 共同的方法被 SubClass 覆寫
void dd(double c){
// method here
}
}
[5]...雖然也因為是抽像類別無法直接產生物件但也接受多型透過子類別產生物件 --> (interface)Father f = new (Subclass)Son();
雖然介面無法產生(new)物件但可以透過多型達到
void main(){
Interface i = new SubClass();
}
========================================================================================
補充:子類別實作抽像類別、介面方法 == 覆寫
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment