10

クラス A から継承するクラス B があります。スーパークラス A は抽象クラスで、1 つの抽象メソッドが含まれています。クラス B に抽象メソッドを実装したくないので、クラス B も抽象として宣言する必要があります。クラスB抽象を宣言すると、2つのことがうまくいきます(プログラムは正しくコンパイルおよび実行されます):

1.) クラスが抽象であるにもかかわらず、クラス B で抽象メソッドを宣言しません。クラスがクラス A の抽象メソッドを継承しているため、これはうまくいくと思います。これは、クラスを抽象として宣言するのに十分です。クラスで直接宣言された他の抽象メソッドは必要ありません。

2.) クラス A で宣言されているのと同じ抽象メソッドをクラス B で宣言します。これはある種のオーバーライド (?) であり、Java でのオーバーライドと同じ意味ではありません (同じヘッダーを使用しますが、異なる実装を提供します)。 )、ここではメソッドの同じヘッダーを再度使用します。

どちらも機能しており、両方とも問題ないかどうか、およびそれらの一部が他のものよりも優先される (より正しい) かどうかはわかりません。2 つの方法は同じですか (Java にとって同じ意味ですか)?

ここでは、いくつかのクラスの例を示します。これにより、意味がより明確になります。

ケース 1.):

public abstract class A {
    public abstract String giveSum();
}

public abstract class B extends A {

}

ケース 2.):

public abstract class A {
    public abstract String giveSum();
}

public abstract class B extends A {
    public abstract String giveSum();
}

よろしく

4

5 に答える 5

35

Javaでは、abstractクラスアノテーションは、クラスを直接インスタンス化できないことを示します。abstractクラスは、インスタンス化されるべきではない(おそらく静的メソッドのみが含まれている)ため、またはそのサブクラスが代わりにインスタンス化されるべきであるという理由だけで宣言できます。

クラスにメソッドが含まれている必要はありませ(逆の場合、1つ以上のメソッドを含むクラスはメソッドである必要があります)。abstractabstractabstractabstract

抽象メソッド定義を複製する必要があるかどうかの質問は、スタイルの質問として認識される可能性がありますが、定義を複製することを支持する引数を思い付くのは難しいでしょう(私が思いつくことができる唯一の引数は、クラス階層によってメソッドのセマンティクスまたは使用が変更される可能性があるため、クラスBに追加のjavadocを提供する必要があります。)

メソッドの再定義に反対する主な論拠abstractは、重複コードが悪いということです。これにより、リファクタリングがより面倒になります(従来の「コードを重複させない」という議論がすべて当てはまります)。

于 2009-01-06T18:34:29.910 に答える
8

機能的には同等ですが、最初のほうが短く、奇妙ではないため優先されます。

于 2009-01-06T18:20:33.980 に答える
2

#1で行きます。子クラスのメソッド宣言を書き直すのはややこしいです。また、親が抽象であるかどうかに関係なく、実際には抽象クラスに抽象メソッドは必要ありません。

于 2009-01-06T18:21:30.107 に答える
2

したがって、問題は次のとおりです。Javaで抽象クラスをサブクラス化し、実装を提供したくない場合、どちらが優先されますか?

a)サブクラスも抽象としてマーク

b)サブクラスも抽象としてマークし、抽象としてマークされたメソッドシグネチャを書き直しますか?

私は最初のものに行きます:

a) サブクラスも抽象としてマークします。

前者はすでに抽象メソッド宣言をしているので、繰り返しても意味がありません。

于 2009-01-06T18:22:55.377 に答える