2013-04-30 50 views
1

基本上,我問的是如何正確地做到這一點,基於我想我想要的。重寫一個虛擬的抽象函數?

我有一個武器類,它是抽象的,因爲它包含像Fire()這樣的通用(激光VS子彈)方法,它們如何觸發它們需要繼承器實現。

然而,一旦我得到一個從武器類繼承的實際彈道武器類。

那麼大部分的火都是一樣的。他們產生彈丸並降低彈藥計數,並等待重新加載計時器降至0,然後再次發射火焰。

無論是坦克炮還是手槍,炮塔或大炮,它都會保持不變而不是變化。

這似乎是一個虛擬類(一個魚雷發射可能需要一個特殊的實施,提升和降低艙門射擊所以它不能被非虛擬/抽象的,它需要修改)

但基本上我想有

抽象武器類火()方法

虛擬彈道武器繼承武器開火()方法

但它似乎沒有,你可以覆蓋一個抽象的方法,使之形成虛擬的。

我不認爲我需要一個全新的方法,但因爲我希望能夠做到

weapon.fire

,並進入ballstic武器和使用實施那裏,除非具體的彈道武器已經超越了這種一般方法。

+1

郵政相關的代碼,不描述它。 – 2013-04-30 03:12:27

+0

@EvanTrimboli本週我見過的最佳評論。 – 2013-04-30 03:13:50

+0

我想你是誤解了一些東西。抽象方法是一種虛擬方法。重寫方法是一種虛擬方法。當你重寫一個抽象方法時,它仍然是虛擬的。它怎麼會不是? – 2013-04-30 05:50:01

回答

1

抽象意味着它必須在子類中重寫,其中虛擬意味着它可以被覆蓋。您可以在抽象類中使用虛擬方法。您可以通過合同等形式結合使用接口解決您的問題:

Ifireable 
0

可能是你可以做這樣的:

abstract class Weapon 
{ 
    public abstract void Fire(); 
} 

class BallisticWeapon 
{ 
    virtual public void Fire() 
    { 
     // Ballistic fire 
    } 
} 

// Weapon need ballistic fire 
class WeaponA : BallisticWeapon 
{ 
} 

// Weapon don't need ballistic fire 
class WeaponB : Weapon 
{ 
    // Implement fire 
    public void Fire() 
    { 

    } 
}