2016-10-11 25 views
3

Javaでストラテジを使用しようとしています。そこで、いくつかのインターフェイス(MortAlterationEtatModifPV)を使用する抽象クラスNenuphareがあり、5種類のNenuphareを作成する必要があります。私が正しいとすれば、抽象クラスとしてNenuphareを保管しなければなりません、私はデザインパターンの戦略にとどまりたいです。最も簡単な方法は、Nenuphareを実装する5クラスを作成し、各クラスに対してMort,AlterationEtatおよびModifPVを変更することです。しかし、私はenumでこれを行う必要があります。残念ながら、すでにenum型を拡張しているため、enumはクラスを拡張できません。ここで抽象クラスを列挙型に拡張 - ストラテジックパターン

Nenuphareのための私のコードです:

public abstract class Nenuphare { 
    public int etatVieillissement = 3; 
    protected String nom = "Eau"; 

    protected Mort mort = new MortSubite(); 
    protected AlterationEtat altetat = new NoAlteration(); 
    protected ModifPV pv = new NoModifPV(); 

    public Nenuphare(){} 

    public Nenuphare(Mort mort, AlterationEtat altetat, ModifPV pv){ 
     this.mort = mort; 
     this.altetat = altetat; 
     this.pv = pv; 
    } 

    public void death(){ 
     mort.mort(); 
    } 

    public void alteration(){ 
     altetat.altEtat(); 
    } 

    public void modificationPV(){ 
     pv.modifPV(); 
    } 
} 

私はNenuphareの私の5種類こうして作成しようとしました:もちろん

public enum TypeNenuphare extends Nenuphare { 
    type1{ this.mort = ..., this.altetat = ..., this.pv = ... }, type2{ ... }, type3 { ... }, type4 { ... }, type5 { ...}; 
} 

、理由extendsの動作しません。 Nenuphareinterfaceと設定し、implementsを使用すると思っていましたが、デザインパターンStrategyを使用する必要があります。私はこれを初めて知ったので、進める方法は本当に分かりません。

答えて

3

列挙型を列挙します。

例:

public enum Strategy{ 
    STRAT1("Strat1", new Mort1()), 
    STRAT2("Strat2", new Mort2()), 
    DEFAULT("default", new MortSubite()); 

    private final String name; 
    private final Mort mort; 

    public String getName(){ return name;} 
    public void death(){mort.mort();} //<- void does not really make sense here. 

    Strategy(String pName, Mort pMort){name = pName; mort = pMort;} 
} 

今だけ...、あなたの "死"、 "変更" のために

使用法を "名前" を交換する:

System.out.println(Strategy.DEFAULT.getName()); 

も参照してください:https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

Sidenote:国際的な状況では、英語の変数名を使用する必要があります。これにより、フランス語以外の話者があなたのコードを理解しやすくなります。

+0

ありがとう、私は抽象クラスを使用してデザインパターンStrategyにとどまらなくてはなりませんでした。ところで、フランスの変数には申し訳ありません。 'public void death(){...}'の場合、メソッドが今のところ何かを出力しているので、それは意味があります。 – pioupiou1211

+0

抽象クラスを使用できますが、そうする必要はありません。 – Fildor

関連する問題