2009-07-27 9 views
0

OOPによると、現実世界には存在しないが、いくつかの実世界オブジェクトの基本クラスとして機能するオブジェクトをモデル化するために抽象クラスが必要です。例についてはC#/ Javaで抽象クラスを使用する技術的な理由

BankAccount    
     /\ 
    /\ 
    / \ 
    / \ 
Current  Savings 
Account  Account 
ここ

銀行口座のは抽象クラスとしてモデル化されなければなりません。

しかし、C#/ Javaで抽象クラスを使用する技術的な理由は何ですか?例えばlink text

:インターフェースを使用するための

OOP理由は、行動継承(本当の階層関係と継承)をモデル化することです。

C#/ Javaでインタフェースを使用する技術的理由は、多重継承の問題を解決することです(私が間違っていない場合)!

+1

参照http://stackoverflow.com/questions/417590/abstract-classes-and-methods-in-java-inheritance and http://stackoverflow.com/questions/239127/exact-use-of-abstract-クラス – jason

+0

と... http://stackoverflow.com/questions/56867/interface-vs-base-class – jason

答えて

8

抽象クラスは、賢明なことが可能な場合はデフォルトの動作を持つことができます。インターフェイスはできません。

抽象クラスは、すべてのメソッドに対してデフォルトの動作を提供できます。開発者の選択。インターフェイスはできません。

抽象クラスは、すべてのサブクラスと共有される状態を持つことができます。インタフェースは状態を指定しません。

あなたの抽象的なBankAccountには、貯蓄と小切手にアクセス権を与えることができる残高属性を設定できます。

+0

抽象メソッドの説明で名前で抽象メソッドを言及する価値があるような気がします。それらは、抽象メソッドの実装を指定することなく、基本クラスの実装がメソッドの存在に依存することを可能にします。抽象クラスを海軍注視型インタフェースと呼ぶかもしれません。とにかく、その答えがあまりにも読みにくいワンライナーでなぜあなたの答えが受け入れられなかったのか分かりません。 – WCWedin

+0

ああ、「抽象メソッドの説明」はもちろん、「抽象クラスの説明」を読んでください。それはあなたが「かろうじて読み解く」指を指すときに起こることです。 – WCWedin

+0

あなたにはとてもいいですね。私は最初に受け入れられましたが、他の答えのまったくの詩が結果を左右しました。 – duffymo

0

抽象クラス抽象クラスはメソッド定義がないためインスタンス化できません。

スーパークラスでは、何もしないメソッド関数を定義できます。しかし、それはばかげている。 「何もしない」と定義するのではなく、何も定義しないでください。

ボディが存在しないため、このメソッドは抽象メソッドです。これは、クラスを全体抽象的にします。


なぜですか?

「何もしない」メソッド本文を指定しないためです。メソッド本体を完全に省略し、プレースホルダーをサブクラスで埋めるようにしたいとします。

サブクラス間で共通の動作を含むようにスーパークラスを作成します。場合によっては、各サブクラスは、オーバーライドまたは拡張を提供するでなければならないため、スーパークラスを完全なクラスにすることはできません。

欠落している機能を提供するためにサブクラスが必要であるため、抽象スーパークラスを提供します。

+0

これは私の質問に答えることはありません。あなたは、なぜそうではなく、どのように言いました –

0

私はあなたの質問を理解していますが、抽象クラスはインスタンス化できないため、この目的にのみ役立ちます。

0

実際の例を示します。私は抽象クラス呼び出しcSourceControlを持っています。次に、Visual Source Safe呼び出し用のクラスcVSSと、cSVNと呼ばれるSubversion用のクラスがあります。どちらもcSourceControlから継承されています。

これで、抽象クラスには、継承クラスでちょうど使用できるバンチプロパティとメソッド(コード付き)があります。このことから

public abstract DataTable getFiles(string path, string filter, DateTime since, bool filterAuthorByLastCheckin, bool expandAll, bool onlySinceBranched); 
public abstract DataTable getFiles(string path, string filter, DateTime since, string lastUser, bool filterAuthorByLastCheckin, bool expandAll, bool onlySinceBranched); 
public abstract long getFile(string sFileName, string sVersion, string sLocalFileName); 
public abstract DataTable getFileVersions(string sFileName); 
public abstract DataTable getDirectories(string path, bool expandAll); 
public abstract DataTable getChangedFiles(string path); 
public abstract DataTable GetFileLogRevision(string path, string revision); 
public abstract DateTime getBranchStartDateTime(string sBranch); 

を使用すると、SourceControlクラスは、これらのそれぞれが必要になりますことを伝えることができますが、それはCVSSで見え方がより非常に異なっている:抽象クラスにも継承されたクラスが実装しなければならない抽象メソッドの束を定義しますそれはcSVNでどのように見えますか?もう一つの利点は、実行時にVSSまたはSVNを選択できることです。単純化されたコードスニップは次のようになります。

cSourceControl sc; 

if(usingVSS) 
    sc = new cVSS(); 
else 
    sc = new cSVN(); 

DataTable dtFiles = sc.getChangedFiles("myproject/branches/5.1/"); 
etc. 

私の顧客は、GitのかSourceGearのために求めて起動したときに今、私はちょうどそれらのクラスを作成し、非常に少ない他を変更する必要があります。

関連する問題