0

すべて同じメソッドを持つクラスのファミリーが必要です。このメソッドは非常に単純なので、次のような最終的な静的にしたい

class A {
   public static final String createSth () { }
}

(実際、このメソッドは文字列のみを返します)。

A、B、C のすべてのクラスを同じメソッドでアッパーキャストすると便利な場合があります。したがって、マザークラスを作成したいと思います。

class abstract Mother {
       public static abstract String createSth () { }
}

次に、すべてのクラス A、B、C ex に適切な拡張を追加します。クラス A はマザーを拡張します。

残念ながら、Java では許可されていません。なぜだろう?

確かに static final 修飾子を削除できれば、すべて問題ありません。しかし、一方で、各サブクラスが、どのような方法でも変更できない定数文字列を返す場合、なぜでしょうか?

そのような構造の目的は何ですか?

単にデータベースのSQL文字列を作成したいだけです。テーブルごとに個別のクラスを作成し、createSth メソッドの結果として、このクラスのテーブルを作成する sql を返す必要があります。

インターフェイスも役に立ちません。

唯一の解決策は、Mother クラスの createSth メソッドから抽象修飾子を削除することです。しかし、Mother クラスにアッパーキャストしたり、子に対して createSth メソッドを呼び出したりすることはできません。したがって、子クラスの static 修飾子を削除する必要があります。

抽象メソッドが静的であることを許可されていない理由を結論付けますか? ここでも理解できますが、非静的抽象メソッドを子クラスの静的メソッドに置き換えることが許可されていないのはなぜですか?

4

3 に答える 3

3

staticメソッド ( と のようfinalprivate) はオーバーライドできないため、派生クラスでそれらを実装する方法がないため、それらを作成してもabstract意味がありません。

于 2013-09-11T13:28:20.077 に答える
2

静的メソッドは継承されないため、抽象化しても意味がありません。

于 2013-09-11T13:27:51.050 に答える
0

finalメソッドは取得しませんoverridden

staticメソッドは を取得しませんが、サブクラスに含めるoverriddenことができますhidden

于 2013-09-11T13:32:02.043 に答える