2017-05-12 14 views
1

this forumについて質問しました。コードを構造化する方法について質問しました。オブジェクトを複数の方法で使用できることを教えてください。すべてのインターフェイスメソッドを実装していないクラス

public interface Weapon { 
    void attack(); 
} 

とReloableインターフェース::それはしかし、私は武器インタフェースと私のリロード方法を組み合わせることが示唆された

public interface Reload { 
    void Reload(Bullet bullets); 
} 

は、私はこのように見えた武器クラスを持っていました全ての武器が再装填可能ではない。武器がリロードされていない場合は、ブール値がfalseを返します

public interface Weapon { 
    void attack(); 
    boolean isReloadable(); 
    void Reload(Bullet bullets); 
} 

、および方法のリロード:ユーザーによると、武器はブールでリロードした場合、私がチェックできるので、私の武器インターフェースは今です空のままになります。プリンシパルに違反しないで、インタフェースのすべてのメソッドを実装する必要はありませんか?代わりがありますか?

+1

は、クラス階層を実装することをお勧めします() ')、それぞれの特定の種類の武器のクラスがそれを拡張しなければならないので、クラス' ReloadableWeapon extends Weapons extends Reload'は 'reload()'メソッドを実装します。 – Spock

答えて

0

代わりに、抽象クラスを使用し、他のクラスによって実際に初期化する必要のない空の本体を持つメソッドを宣言することができます。

0

誰かが

....実装されていない/空のメソッドを残さない再ロード可能な武器に reload()を呼び出す代わりの場合は掲載アプローチが UnsupportedOperationExceptionを投げ方が良いだろうとそれは、dessignの問題です
1

リロードを別のインターフェイスに移動するアイデアは、クラスを定義するときに必要に応じてインターフェイスをミックスして一致させることができます。武器を再読み込みできない場合は、それをモデル化するクラスにReloadableインターフェイスを実装しないでください。

class AK47 implements Weapon, Reloadable { 
    public void attack() { 
     System.out.println("rat-a-tat"); 
    } 
    public void reload(Bullet bullets) { 
     System.out.println("+30 rounds"); 
    } 
} 
class Chainsaw implements Weapon { 
    public void attack() { 
     System.out.println("Bzzzz"); 
    } 
} 

あなたはWeaponのインスタンスがReloadableであるかどうかをテストするinstanceof演算子を使用することができます。ここでは

は一例です。

0

あなたのインタフェース契約を知っておく必要があります。 武器の攻撃と再読み込み。

public interface Weapon { 
void attack(); 
void reload(Bullet bullets); 
} 

武器は再ロード可能な契約に属していないが、それはリロードメソッドを実行するだけでcanditionだ、それはCOMMUNの行動だ、と私たちは共通の話をするとき、我々はAについて話しているかどうかを確認するには母クラス。

このインターフェイスを実装する抽象クラスが必要です。例えば

public abstarct class AbstractWeapon implements Weapon { 
public abstract void attack(); 
public void reload(Bullet bullets){ 
    if (isReloadable()) 
    reloadBullet(bullets); 

} 
public abstract void reloadBullet(Bullet bullets); 
public abstract boolean isReloadable(); 
} 

あなたのクラスの武器(AK12)はAbstractWeaponを継承し、このような三つの方法reloadBullet、攻撃とisReloadable、実装することができるようになります。finnally

public class Ak12 extends AbstractWeapon{ 
public void attack(){ 
    //TO IMPELEMENT 
} 

public void reloadBullet(Bullet bullets){ 
    //to implement 
} 
public abstract boolean isReloadable(){ 
//To implement 
} 
} 

を、あなたはあなたであなたのAK12を参照することができますインターフェース:

Weapon ak12 =new Ak12(); 

とあなたのAK12攻撃やリロードし、あなたを尊重が

再ロード可能な状態であります何もしない

public abstract class AbstractWeapon implements Weapon{ 
    private Reload reload = EmptyReload.instance(); //default do nothing 

    public Reload getReload() { 
     return reload; 
    } 

    public void setReload(Reload reload) { 
     this.reload = reload; 
    } 

    //add reload method 
    public void reLoad(Bullet bullets){ 
     reload.reload(bullets); 
    } 
} 

EmptyReload空のオブジェクトです::

public class EmptyReload implements Reload{ 

    private static EmptyReload emptyReload = new EmptyReload(); 

    private EmptyReload() { 
    } 

    public static EmptyReload instance(){ 
     return emptyReload; 
    } 

    @Override 
    public void Reload(Bullet bullets) { 
     //can not reload,do nothing 
    } 
} 

私は別のインタフェースが優れているとして、あなたはセットがダイナミックを実装リロードすることができますリロードを定義が考える10

0

あなたの銃は:

public class Gun extends AbstractWeapon{ 
    public Gun() { 
     setReload(bullets -> System.out.println("reload bullets")); 
    } 

    @Override 
    public void attack() { 
     //impl 
    } 
} 

かお好きな時に実装してリロードを変更します。このよう `攻撃などの武器のすべての種類のすべての属性とメソッドのコモンズを(含まれている抽象クラスの武器:私の意見では

Gun gun = new Gun(); 
gun.setReload(bullets -> System.out.println("switch reload interface")); 
関連する問題