私はこれを間違った方法で行っていると確信していますが、特定のクラスのインスタンスがセットの要素を表し、クラスの静的メソッドがセットのプロパティを全体。最初は 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 つの要素間でグループ操作を許可する必要があることに気付きましたが、これは意味がありません。では、この種の構造を実装する正しい方法は何ですか?