2009-03-02 13 views

答えて

37

基本クラスをインスタンス化できないようにするには、抽象クラスにする必要があります。それ以外の場合は通常のクラスのままにしておきます。

+1

基本クラスをインスタンス化する意味がない場合は、抽象クラスにします。 – mbillard

0

基本クラスを単独で呼び出す予定がない場合は、それを抽象クラスとして定義する必要があります。

+0

私はそれが十分ではないと思います。クラスの抽象宣言は、それを直接インスタンス化するのが無理な場合にのみ宣言してください。あなたが計画しているかどうかはまったく別の問題です。 –

0

基本クラスを独自に実装するかどうかによって異なります。

抽象クラスとしてオブジェクトを作成することはできません。

6

それは、問題の基本クラスが派生することなくそれ自身の上に存在することは意味がありますか?答えが "はい"の場合、それは通常のクラスでなければなりません。そうでなければ、抽象クラスでなければなりません。

16

ベースクラスをインスタンス化してはならない場合は、それを抽象クラスにします。ベースクラスをインスタンス化する必要がある場合は抽象クラスにする必要があります。それは、基本クラスとして抽象基底クラスは、任意の具体的な意味を持っていないにするために理にかなっています。この例では

abstract class WritingImplement 
{ 
    public abstract void Write(); 
} 

class Pencil : WritingImplement 
{ 
    public override void Write() { } 
} 

しかしこの次の例では、あなたは、基本クラスには具体的な意味を持っているかを確認することができます:

class Dog 
{ 
    public virtual void Bark() { } 
} 

class GoldenRetriever : Dog 
{ 
    public override void Bark() { } 
} 

あなたは特定のドメインのニーズに基づいてかなり良い判断を下すことができなければなりません。

0

抽象クラスは事前定義された機能に適しています。たとえば、クラスが公開する必要のある最小の正確な動作を知っていて、それを実行するために使用するデータや正確な実装がわからない場合です。

abstract class ADataAccess 
{ 
    abstract public void Save(); 
} 

ノーマル(非抽象)クラスは同様のもののために素晴らしいことができますが、あなたがそれらを書くことができるように実装の詳細を知っている必要があります。

public class DataAccess 
{ 
    public void Save() 
    { 
     if (_is_new) 
     { 
      Insert(); 
     } 
     else if (_is_modified) 
     { 
      Update(); 
     } 
    } 
} 

また、あなたはプロトタイプ定義の同じ種類を定義するためのインタフェース(個別に、またはクラスの、抽象的かどうか)を使用することができます。

interface ISaveable 
{ 
    void Save(); 
    void Insert(); 
    void Update(); 
} 

class UserAccount : ISavable 
{ 
    void ISavable.Save() { ... } 
    void ISavable.Insert() { ... } 
    void ISavable.Update() { ... } 
} 

さらに別のオプションを使用している可能性があり、ジェネリック

class GenDataAccess<T> 
{ 
    public void Save() 
    { 
     ... 
    } 
} 

すべてのこれらのメソッド

は、クラスがで動作するため、特定のプロトタイプを定義するために使用することができます。コードAがコードBと対話できることを確認する方法。もちろん、上記のすべてを好みに合わせて組み合わせることができます。明確な正しい方法はありませんが、インタフェースと抽象クラスを定義し、そのインタフェースを参照するのが好きです。そうすることで、より高いレベルのクラスでの「配管」の考え方の必要性が排除され、最大の柔軟性が維持されます。 (インタフェースが抽象基本クラスを使用する必要はなく、オプションとして残します)。

1

抽象クラスは、部分的に実装されたクラスです。

それ自体は、抽象クラスのインスタンスを持つことは意味をなさないので、それを導出する必要があります。基本クラスを作成したい場合は抽象クラスにすることはできません。

私は抽象クラスをすべてのサブクラスに共通であるため、いくつかのメンバーがあらかじめ定義されたインターフェースとして考えることが好きです。この

1

考える別の方法

私の基本クラスは、それ自身の上に完全なオブジェクトですか?

答えが「いいえ」の場合は抽象化します。もしそうなら、あなたはそれを具体的なクラスにしたいでしょう。

3

私はお勧め:

  • インターフェイスを作成します。
  • 基本クラスにインターフェイスを実装します。
  • 基本クラスを抽象クラスではなく、実クラスにします(以下の理由を参照)。

私は本当のクラスの代わりに、抽象クラスを好む理由は、抽象クラスは、将来の選択肢不必要を制限する、インスタンス化できないということです。たとえば、後で基本クラスが提供する状態とメソッドが必要な場合がありますが、継承することはできず、インターフェイスを実装する必要はありません。基本クラスが抽象クラスの場合、私は不運ですが、基本クラスが通常のクラスであれば、基本クラスのインスタンスを作成し、それを他のクラスのコンポーネントとして保持し、インスタンスを再利用するためにインスタンスに委譲できます州/方法を提供する。

はい、これは頻繁に起こることではありませんが、要点は、理由がない場合に、この種の再利用/解決策を防ぐためです。

さて、基本クラスをインスタンス化する場合は何とかそれは抽象作り、その後、危険である - 可能;-)

3

は、銀行口座のようなものだと考えた場合、または好ましくは、それは危険の少ないます

あなたは「口座」という一般的な抽象基本口座を作ることができます。これは、顧客の詳細などの基本情報を保持します。

"SavingAccount"または "DebitAccount"と呼ばれる2つの派生クラスを作成できます。これらのクラスは、基本クラスの振る舞いの恩恵を受けながら独自の動作を行うことができます。

これは、顧客が貯蓄口座またはデビット口座のいずれかを所有している必要がある状況です。一般的な「口座」は、現実世界であまり一般的ではないため説明のないアカウントではありません。

必要に応じて同様のシナリオを作成できれば、抽象的な方法があります。

-8

私はあなたの多くが再び基本的なOOクラスを再設定すべきだと思います。

OOA/OODの基本原則は、抽象抽象を抽象化することです。抽象抽象を抽象化することができなくなるまでです。あなたの見ているものが抽象であれば、それはあなたのOOA/OODがすでにあなたに言ったことです。しかし、あなたが "コード"が抽象的であるべきかどうか疑問に思っているなら、明らかにその用語の意味を理解しておらず、基本的なOOA/OOD/OOPをもう一度学ばなければならない:-)

デザインパターンとハーモニック理論を学ぶことで、あなたのオブジェクト指向設計を大いに助けます!

+8

私はあなたに多くの読書をすると言うことができます。そのエネルギーの代わりに、攻撃的ではなく書き方を学ぶことに費やしてください。 –

関連する問題