抽象クラス、インターフェースなどに精通しています。
明確でないのは、抽象メンバーを持たない C# 抽象クラスを作成する理由です。(C# コンパイラはこれを許可します)。
例:
public abstract class House
{
public void OpenDoor()
{
Console.WriteLine("Door opens");
}
}
抽象クラス、インターフェースなどに精通しています。
明確でないのは、抽象メンバーを持たない C# 抽象クラスを作成する理由です。(C# コンパイラはこれを許可します)。
例:
public abstract class House
{
public void OpenDoor()
{
Console.WriteLine("Door opens");
}
}
simply because: you are expected to subclass it?
Maybe in this context, House
simply isn't specific enough; sure, all things in this relationship are houses, but it is expecting concrete types such as Bungalow
, Mansion
, Apartment
, etc... So House
serves as a useful categorisation (for example, in a List<House>
or a property of type House
) - but you would never expect to have an actual instance of that common base type.
それらのために物事を自動実装するためだけに、たとえばGetHashCode
、または多分のデフォルト実装を提供しますToString
。また、抽象クラスが実装するインターフェイスにメソッドを追加し、デフォルトの実装を提供すると、すべてのクラスが壊れて手動ですべてを修正する必要がある他のオプションの代わりに、何も壊れません。
一部のプラットフォーム (おそらく企業内) は、後のバージョンでメソッドを追加できるように、プログラマーがサブクラス化する必要がある抽象クラスを定義する可能性があると想像できますか?
抽象クラスは、継承の基本として使用するのではなく、継承する論理クラスに近いものです。抽象クラスを使用して、継承するすべての人に特定のプロパティまたは特定のメソッドを実行するように指示できます。インターフェイスは次のことができます。まさにそれをしてください。
私は哺乳類クラスを持っているとしましょうが、哺乳類クラスは単なる抽象クラスであり、「プロパティ」を継承する多くの動物 (人間を含む) が存在しますが、哺乳類の一種である実際の動物はありません。
繰り返しますが、抽象的な使用は間違いなく開発者の選択次第です。
抽象メンバーを持つ抽象クラスは、多態的に使用されることを意図しています。共通のメソッドをサブクラスと共有したい場合は、具象メンバーのみを持つ抽象クラスが使用されます (抽象クラスのコンストラクターに「ハウスキーピング」のセットアップを実行させる場合など)。
これは、ポリモーフィックなサブクラスよりも弱い形式の結合であり、自分で遭遇したことは考えられません。
一般化
抽象クラスは、概念的な「インターフェース」になることができます。これは、.NET インターフェイスとは異なります。一般化されたインターフェースの例は次のとおりです。
// List that accepts the conceptual interface
List<Car> cars = new List<Car>();
// Specialized instance that will be added to the list
Car myCar = new Toyota();
cars.Add(myCar);
継承
複数のインターフェイスを実装できますが、1 つの抽象クラスからのみ継承できます。これは、クラス ライブラリの開発者が行う設計上の決定である可能性があります。
使用法
Dhananjayは、使用法について素晴らしい記事を書きました。彼は、抽象クラスはクラス階層のモデル化に使用されると述べています。ただし、インターフェイスは通信に使用されます。オブジェクトが実際に存在するかどうかは問題ではありません。
基本クラスが実装を定義するようにします。実装がすべての派生クラスで共通である場合、派生クラスのコードを複製せずに抽象クラスに保持することは理にかなっています。
このリンクを参照してください。これに関する有用な情報があり ます http://www.codeproject.com/Articles/6118/All-about-abstract-classes
抽象クラスはテンプレートとして機能します(デフォルトの実装を提供する場合と提供しない場合があります)が、子は好きではないもの、または追加のメソッド/プロパティ/などを上書きできます。
非常に興味深いシナリオは、型制約の継承です。
public abstract class MyClass
{
public void DoSomething()
{
Console.WriteLine("blah blah");
}
}
public class MyClass<T>: MyClass
{
public T GetSomething()
{
// return null as T;
}
}
デフォルトの実装が基本クラスにあることがわかります。