iT邦幫忙

1

[討論] 繼承的迷思

如下圖,如果MachineGun的shoot處理邏輯和Rifle的shoot處理邏輯一樣,
該如何讓兩邊的邏輯只寫到一個地方,之後只要修改一處,就可以將兩邊的shoot方法都修改?
怎麼樣的方式是實際專案上會用的?

https://ithelp.ithome.com.tw/upload/images/20190905/20108694iazAN0Tt2u.png

0
小魚
iT邦大師 1 級 ‧ 2019-09-05 15:31:43

不可以直接使用父層的方法嗎?

父層是抽象類別,除非中間再加一層,讓MachineGun和Rifle繼承,但如果只是為了一個方法相同而使用繼承,那類別會多到沒完沒了,所以是否有其他方式?

0
YoChen
iT邦研究生 5 級 ‧ 2019-09-05 16:07:39

您應該先有一個類別Gun去實作抽象類別AbstractGun,然後用Gun類別建立基本的Shoot方法,最後才是讓各個子類別繼承Gun然後Override Shoot

看更多先前的回應...收起先前的回應...

所以說只是為了一個方法相同而使用繼承,那類別會多到沒完沒了,所以是否有其他方式?

YoChen iT邦研究生 5 級 ‧ 2019-09-05 16:15:33 檢舉

除非您希望每個子類別都必須Override Shoot,不然沒有必要將Shoot宣告在AbstractGun裡,您可以考慮直接拿掉整個abstract class,宣告一個一般class就好

宣告一個一般Class,一樣會有我說的問題

YoChen iT邦研究生 5 級 ‧ 2019-09-05 16:37:56 檢舉

依我的理解您要的感覺是這樣,還是我搞錯了? XDDD

class Gun
{
    public void Shoot()
    {
        // 邏輯寫在這,假設會輸出"蹦蹦"
    }
}

class GunA : Gun
{
    // 不用再寫 Shoot()
}

class GunB : Gun
{
    // 不用再寫 Shoot()
}

Main()
{
    GunA a = new GunA();
    GunB b = new GunB();
    a.Shoot(); // 蹦蹦
    b.Shoot(); // 蹦蹦
}

是這樣沒錯,問題是就必須要增加Gun這個類別,只為了Shoot這個方法要一致而增加,感覺成本太高

kgame iT邦新手 4 級 ‧ 2019-09-06 01:27:18 檢舉

有種成本太高叫做我感覺成本太高

YoChen iT邦研究生 5 級 ‧ 2019-09-06 10:14:54 檢舉

還是您直接把AbstractGun Shoot方法的abstract建構子拿掉就好? XDDDD

0
sion
iT邦新手 4 級 ‧ 2019-09-06 10:02:21

不要太拘泥於繼承吧
寫個shoot類別再傳入阿
大概像這樣

class Shoot
{
    void shootA()
    //邏輯
    void shootB()
    //邏輯
}
class MachineGun:AbstractGun
{
    Shoot s;
    void do()
    {
        s.shootA();
    }
}
class Rifle:AbstractGun
{
    Shoot s;
    void do()
    {
        s.shootA();
    }
}

類似utility tools作法?

kgame iT邦新手 4 級 ‧ 2019-09-07 14:54:25 檢舉

稱做依賴注入

我要發表回答

立即登入回答