0

私には非常に特殊な状況があります。状況のコンテキストは、私が Minecraft 用のプラグインを作成していて、設計上の問題が発生したことです。抽象クラス、インターフェース、およびそれらの派生具象クラスの階層を構築しました (問題がある場合は Java で)。構造の一般的な考え方は次のとおりです。

パブリック インターフェイス ICommandUsage、ICommandPattern、IPermissionNode

(これらは、各コマンドがコマンドの適切な使用法を定義し、正規表現と一致する特定のパターンに従い、コマンド送信者がコマンドを使用できるかどうかを許可する許可ノードを持つ必要があるように実装されています)

public abstract class Command = 基本クラス

public abstract class ConsoleCommand = Command クラスの派生サブセット

public abstract class PlayerCommand = Command クラスの派生サブセット

public abstract class UserCommand = PlayerCommand の派生サブセット

public abstract class ServerAdminCommand = PlayerCommand の派生サブセット

残りのクラスは、インターフェイスと抽象クラスから関数を定義するさまざまな具体的な実装です。

これが私のジレンマです。プラグインを開始すると、「メイン」クラスはすべてのコマンドを登録するため、ユーザーがコマンドを発行すると、commandDelegate はパターン マッチングを介してコマンドを解釈できます。パターン マッチングは、メソッド getPattern() から取得されます。このメソッドは、各具象クラスに半ハードコード化された String を返します。

私の論理は、各具体的なクラスが独自のパターン、許可ノード、および使用法を担当する必要があるため、これらのメソッドはクラス自体に存在する必要があるというものです。

主な問題は、メイン クラスにコマンドを登録するときに、コンストラクターに null 引数を渡して「偽の」コマンドを作成する必要があることです...

つまり、registerCommand("console_info", new ConsoleInfo(null, null));

これが悪い習慣であることは認識していますが、解決策を見つけるためにどこを見ればよいのか途方に暮れています。誰かが私を正しい方向に向けることができれば、とても感謝しています。

4

1 に答える 1

0

Java では、各コンストラクターが異なる型または複数の型の引数を取る限り、1 つのクラスに対して複数のコンストラクターを作成できます。例えば

public class Thing {

private int value;

public Thing(int i) {
    value = i;
}
public Thing() {
    value = 0;
}
}

そのため、引数に 2 つの null 値を使用してクラスを構築するのではなく、引数のないコンストラクターを作成し、クラス内でそのケースを処理します。これにより、将来、クラスが引数なしで構築された場合の標準を変更することにした場合に、簡単に変更できます。

于 2013-07-07T20:50:12.560 に答える