2011-08-25 18 views
6

時々、私は次のようにいくつかのクラスデザインに出くわしました。具体的な親を拡張して抽象的な子供を持つ目的

abstract class animal { 
    public abstract void speak(); 
} 

class dog extends animal { 

    @Override 
    public void speak() { 
     // Do something. 
    } 

} 

abstract class abstract_dog extends dog { 
    @Override 
    public abstract void speak(); 
} 

私が思っていた、abstract_dogクラスを持つことの目的は何ですか?私たちが非抽象的な発話方法を抽象的に「変換」する理由は何ですか?

+0

注:クラス階層を制御する場合は、具体的な犬クラスを完全に削除するか、またはサブクラスabstract_dogを使用する方が良いでしょう。非リーフクラスの抽象クラスを作成することを推奨します。 –

答えて

4

人々がspeakを上書きするように強制する基本クラスを作成する場合は、Dogを継承します。

+0

あなたの答えは技術的には正しいですが、私がレビュー中にそれを見つけた場合、私はまだこのコードのにおいと考えています。(まだ+1) – nfechner

+0

@nfechner:それは特定の状況に完全に依存します。私はこれを5年以上の開発期間で正確に行う必要があったと思います。 – SLaks

+0

+1あなたの答え(と同様に質問)は、いくつかの現実的な状況に欠けているが、単純な理由で+1。 –

0

私はSLaksに同意し、これが現実の状況であろうと思う:

abstract class animal { 
    public abstract void speak(); 
} 

class dog extends animal { 

    @Override 
    public void speak() { 
     // Dog says 'bark' 
    } 

} 

abstract class abstract_dog extends dog { 
    @Override 
    public abstract void speak(); 
} 

class poodle extends abstract_dog { 
    @Override 
    public void speak() { 
     // poodle says 'yip yip' 
    } 
} 

class great_dane extends abstract_dog { 
    @Override 
    public void speak() { 
     // great dane says 'ruff ruff' 
    } 
} 

私はあなたがあなたが作る新しい子クラスがspeakメソッドを実装したい場合にはこれを使用すると思うし、 dogクラスには、新しい子クラスが実装する必要のない他のメソッドがあるかもしれません。
正確な状況を把握することで、このシナリオに適した設計があるかどうかを判断するのに役立ちます。

+0

しかし、この例では、abstract_dogをスキップすることもできます。 – Buhb

+0

@Buhb、それは本当であり、このデザインでは潜在的な問題です。 – rosscj2533