0

インターフェイスに関するアドバイスが必要です。他のユニットを攻撃できるユニットというクラスがあります。攻撃は空中または地上で行うことができます。と呼ばれる攻撃を達成するための単一の方法が必要attack()です。一部のユニットは地上ユニット、一部の航空ユニット、またはその両方のみを攻撃できます。

これは私がこれまでに思いついたものです:

public interface Attack() {
    public void attack(SCObject object);
}

public interface GroundAttack() extends Attack {
    public void groundAttack(SCObject object);
}

public interface AirAttack() extends Attack {
    public void airAttack(SCObject object);
}

私は異なる単位を持つことができます:

Unit extends SCObject implements GroundAttack {
}

Unit extends SCObject implements AirAttack {
}

Unit extends SCObject implements AirAttack, GroundAttack {
}

問題は、この実装では2つの地上と空中のオプションが明らかになるのに対し、私はattack()メソッドのみを表示したいということです。あなたは解決策を提案できますか、それともこれはあなたにとって大丈夫だと思いますか?

4

2 に答える 2

4

私は使うだろう

public interface Attack {
    public boolean canAttack(SCObject object);
    public void attack(SCObject object);
}

この振る舞いを公開したくないのであれば、特定の地上または空中攻撃方法を持つ理由はわかりません.

于 2012-08-13T10:06:21.233 に答える
3

攻撃する能力は攻撃者と被害者の間の相互作用に依存することを考えると、訪問者またはダブルディスパッチのパターンがここに当てはまると思います。

攻撃者が自分自身を引数としてattacks()渡す何らかの形式の呼び出しにより、被害者は攻撃の有効性を判断できます。これにより、実行時に攻撃性を変更できる可能性があることに注意してください(たとえば、「地上」ユニットを空中に飛ばすことができますか?)

于 2012-08-13T10:09:03.567 に答える