show code block

2018年11月14日 星期三

Java基礎:抽象abstract 和 介面interface




抽象方法abstract 和 介面interface

直接進入正題

abstract可以解釋成“一定會有的東西,所以只能繼承一次。
interface可以解釋成“附屬品”,可有可無,但有大量的東西都需要它,他就派上用場了。

舉實際的例子:武器
武器都一定有攻擊力、攻擊範圍、名字

這時候如果你需要大量的使用到武器,那上述說的『攻擊力、攻擊範圍、名字』這些東西就適合放在abstract。
但武器百百種,可能長槍會有紅櫻、刀和劍會有劍柄而且也可能會有紅櫻、長弓、短弓和十字弓會有
這些東西就不是一定會存在武器內的東西,我們就可以使用interface




實作:
先把傷害、攻擊範圍、武器名稱寫成abstract
武器.java

abstract public class 武器 {
    abstract int damage();

    abstract int range();

    abstract String getName();
}
這樣武器的基底,就出現了。
來製作武器吧
先來做一把霸王槍
霸王槍.java

public class 霸王槍 extends 武器 {

    @Override
    int damage() {
        return 200;
    }

    @Override
    int range() {
        return 80;
    }

    @Override
    String getName() {
        return getClass().getSimpleName();
    }

}

一把霸王槍就誕生了,他同時擁有了傷害、攻擊範圍、和名稱
再來創建一把青龍偃月刀配戴紅櫻

武器紅櫻.java
interface 紅纓 {

    int 裝配紅櫻();
}

然後是青龍偃月刀.java
public class 青龍偃月刀 extends 武器 implements 紅櫻 {
    @Override
    public int damage() {
        return 250;
    }

    @Override
    protected int range() {
        return 90;
    }

    @Override
    protected String getName() {
        return getClass().getSimpleName();
    }

    @Override
    public String 紅櫻樣式() {
        return "大花樣,關羽專用";
    }
}

這樣就區分了青龍偃月刀和霸王槍之間的差別。
再來
每把長槍,希望青龍偃月刀比較不同,那就給他一個顏色吧
武器顏色.java
public interface 武器配色 {
    String 顏色();
}

在改動青龍偃月刀
public class 青龍偃月刀 extends 武器 implements 紅櫻,武器配色 {
    @Override
    public int damage() {
        return 250;
    }

    @Override
    protected int range() {
        return 90;
    }

    @Override
    protected String getName() {
        return getClass().getSimpleName();
    }

    @Override
    public String 紅櫻樣式() {
        return "大花樣,關羽專用";
    }

    @Override
    public String 顏色() {
        return "青龍色";
    }
}


有注意到了嗎?
武器的是每一把、每一種武器都能套用的,但介面的部分可以一直增加。

此時我在創造一把武器,干將劍

我要有刀柄和紅櫻
干將劍.java
public class 干將劍 extends 武器 implements 武器刀柄,紅櫻{
    @Override
    public int damage() {
        return 170;
    }

    @Override
    protected int range() {
        return 10;
    }

    @Override
    protected String getName() {
        return getClass().getSimpleName();
    }

    @Override
    public int 刀柄長度() {
        return 5;
    }

    @Override
    public String 紅櫻樣式() {
        return "春秋古代款";
    }
}


一把佩戴紅纓的春秋款干將就誕生了

大致上abstract 和 interface的用法就是這樣

在寫個人使用他們吧:
我招喚出
張無忌.java
public class 張無忌 {

    private 武器 weapon;

    public void attack() {
        if (weapon == null) {
            System.out.println("張無忌空手,使用拳頭,造成敵人十點傷害");
            return;
        }
        System.out.println("張無忌使用 " + weapon.getName() + ",造成敵人" + weapon.damage() + "傷害");
    }

    public void 換武器(武器 weapon) {
        this.weapon = weapon;
    }

}


之後再MainActivity.java內來操作。
MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        張無忌 person = new 張無忌();

        person.attack();

        武器 weapon = new 干將劍();
        person.換武器(weapon);
        person.attack();
    }

}





沒有留言:

張貼留言

協程(coroutine) - 協程為什麼要學它?

 Coroutine 協程 再強調一次 協程就是由kotlin官方所提供的線程api //Thread Thread { }.start() //Executor val execu...