0

私はこれを間違った方法で行っていると確信していますが、特定のクラスのインスタンスがセットの要素を表し、クラスの静的メソッドがセットのプロパティを全体。最初は 1 つのクラス、つまり 1 つのセットだけから始めましたが、それを同様のセットに拡張し、それらすべてで機能する汎用メソッドを用意したいと考えています。より多くのクラスを作成し、それらをすべて同じインターフェイスに拡張することを考えていましたが、これには静的メソッドを指定するインターフェイスとそれらをオーバーライドする実装クラスが含まれます。

この問題は、群論を使用して説明するのが最もよいと思います。ご存じない方のために説明すると、グループは一連の要素と、2 つの要素を組み合わせて 3 番目の要素を返すグループ操作 (* で表される) で構成される数学オブジェクトです。他の条件の中で、すべての e に対して a * e = a となる恒等元 e が必要であり、すべての要素 a が a * ai = e となる逆 ai を持たなければなりません。最も単純な例は、加算が群演算であり、恒等要素がゼロで、要素の逆数がその否定である整数です。グループの要素を操作するジェネリック クラスがある場合、グループの ID 要素が何であるかを知る必要がある場合があります。

したがって、グループのサンプルインターフェイスは次のようなものになる可能性があります

public interface GroupElement {

    public GroupElement operate(GroupElement element);

    public static GroupElement identity();

}

整数の実装は次のとおりです (既存の Integer クラスとの明らかな競合は無視してください)。

public class Integer implements GroupElement {

    private int i;

    public Integer(int i) {
        this.i = i;
    }

    public Integer operate(Integer other) {
        return new Integer(i + other.i);
    }

    public static Integer identity() {
        return new Integer(0);
    }
}

そして、ある要素が別の要素の逆であるかどうかをチェックするジェネリック オブジェクト:

public class InverseChecker <E implements GroupElement> {

    public boolean isInverse(e element1, e element2) {
        return element1.operate(element2).equals(E.identity());
    }
}

明らかに、上記のコードには多くの誤りがあります。最初の問題は、インターフェイスで静的メソッドを宣言できないことです。抽象親クラスを使用したとしても、子クラスは静的メソッドをオーバーライドできませんでした。identity() メソッドを非静的にすることもできますが、その場合、常に必要とは限らないインスタンスが必要になります。また、ジェネリック型 E から静的メソッドを呼び出すこともできません。グループ用とグループの要素用の 2 つのインターフェイスを作成できると思いますが、そうすると、InverseChecker オブジェクトのようなものからのコードが非常に複雑になるようです (すべてに 2 つの型パラメーターが必要になり、書き直す必要があります)。 2 つのインターフェース間の関係をどのように指定すればよいかわかりません)。また、これを入力したときに、インターフェイスが構築される方法では、異なるグループの 2 つの要素間でグループ操作を許可する必要があることに気付きましたが、これは意味がありません。では、この種の構造を実装する正しい方法は何ですか?

4

2 に答える 2

1

ここでの解決策は、現状のように、物事を別の方向から見ることです。グループはその要素とは別のオブジェクトである必要があり、グループオブジェクトにはT operate(T, T)T identity()メソッドが必要です。

言い換えれば、GroupElementインターフェイスを持とうとするのをやめて、インターフェイスを持てGroup

また、ジェネリクスはおそらく問題を単純化するでしょう: a Group<T>with elements of type T.

于 2013-01-08T23:08:01.783 に答える
1

最初の文の句を考えてみましょう:「特定のクラスのインスタンスはセットの要素を表します」。これには、「要素」と「集合」という 2 つの問題関連の名詞が含まれています。私が最初に考えたのは、この問題についてさらに学ぶにつれて変わる可能性があるが、Element と Set という 2 つのクラスを持つことでした。java.util.Set との混同を避けるために、"Set" の名前を変更するかもしれません。これが群論である場合は、"Group" が適切な代替手段になります。

そうすれば、エレメント関連のメソッドを Element に、セット関連のメソッドを Set に入れることができます。両方とも、通常のオーバーライドでサブクラス化できます。

于 2013-01-08T23:14:14.687 に答える