2011-07-07 14 views
9

私は、抽象メソッドが最初の具象実装クラスによってオーバーライドされなければならない理由について興味があります。なぜ抽象メソッドは最初の具象クラスによって実装されなければならないのですか?

私はこれをしたいが、私はそれが最初のクラス

宣言せずにこの例をあなたの例では

abstract class Upper 
{ 
    abstract void doSomething(); 
} 

class Middle extends Upper 
{ 
    void doSomething() 
    { 
     // I'm forced to be implemented here 
    } 
} 

abstract class Lower extends Middle 
{ 

} 

class Bottom extends Lower 
{ 
    void doSomething() 
    { 
     // I'm valid, but I'm too far down the hierarchy 
    } 
} 
+3

おそらく、具象クラスは抽象メソッドを持つことができないためです。 '抽象'クラスだけが '抽象'メソッドを持つことができます...私には意味があります。 –

答えて

24

定義によって、通常のクラスはすべての抽象メソッドを実装する必要があります。ミドルアブストラクトを宣言する場合は、ミドルにメソッドを実装する必要はありません。

通常クラスはインスタンス化できますが、抽象クラスはインスタンス化できません。あなたがクラスに実装されていないメソッドを呼び出そうとするとどうなるか考えてみてください。

0

を考えるになければならない理由として興味が示唆されていませんよ途中でdoSomethingを実行するコードはありません。したがって、クラスは抽象クラスでなければなりません。

0

実際にはの質問ではありません。です。 抽象クラスは、実装のない1つ以上のメソッドを持つ単なるクラスです。

これは、生物学的なヒトの男性であるといったよりも、はY染色体を持つである必要があります。法律ではありません。それは定義の一部です。あなたの例では

あなたはMiddledoSomethingを実装したくない場合、あなたは本当にMiddle、コンクリートになりたくありません。つまり、定義のないメソッドを持つことになります。だから抽象です。

もちろん、何もしない空の関数として実装することもできます。それはあなたが尋ねていることにかなり近いです、私は信じています。

これは単なる用語の問題です。実装されていないメンバーがある場合は、型の抽象クラスです。それは簡単です。

3

中間が具象クラスの場合、抽象メソッドを定義しなかったインスタンス化バージョンは(定義を持たないため)呼び出し可能ではありません。これは本質的にミドルも抽象クラスにするでしょう。

6

具体的なクラスは具体的です。
これは、初期化して使用できる必要があることを意味します。
メソッドを実装していない場合、どのように適切に使用されますか?それは不完全なので、具体的ではありません。

別の抽象クラスに抽象クラスを継承させることができます。

2

抽象メソッドではない抽象クラスを抽象メソッドにすることはできません。メソッドが必要ない場合は、そのクラスを拡張する必要はありません。

代わりに、ちょうどclass Lower extend Upperがあります。

Lowerが抽象メソッドを継承し、Middleから継承したい場合は、単にMiddleを抽象として宣言します。

4

Middleを抽象クラスにしても問題ありません。

あなたはそれからdoSomethingを削除も具象クラスとしてMiddleが、を維持したい場合は、このコードが何をしたいと思うものを説明してください:

Upper x = new Middle(); 
x.doSomething(); 
1

あなたはdoSomethingを実装することを強制していますMiddleは具体的なクラスなのでMiddleにあります。つまり、Middleはスーパークラスからのすべての抽象メソッドの実装と、それが実装するインターフェイスからのインターフェイスメソッドの実装を提供する必要があります。

Middleを抽象クラスとしてマークした場合、doSomethingの実装をBottomに委任できます。

抽象クラスの詳細については、Java Language Specificationのこのリンクを参照してください。

関連する問題