再利用可能なライブラリの「抽象クラス」と「通常クラス」
-
25-09-2019 - |
質問
私は再利用可能なライブラリを開発しており、クライアントがそこから拡張できるように抽象クラスを作成しています。
質問:実際、ここで通常のクラスではなく抽象クラスを使用する必要がある理由はありますか?
注 - 実際のデフォルトメソッドをライブラリに含めたいので、インターフェイスを使用しないことをすでに決定しています。そうすることで、インターフェイスを使用するクライアントはコードを記述する必要がありません。
編集:だから私は思いつかない利点を探しています。たとえば、ライブラリをアップグレードする場合、抽象クラスを使用するとクライアント コードへの影響が軽減されますが、この場合は影響が軽減されるとは思えません。
解決
は、使用する理由はありません。の抽象の
あなたのクラスを継承し、簡単に拡張可能にするために、使用したい場合は、の仮想のあなたの方法上とを確認してください持っている使用可能なの保護のコンストラクタます。
他のヒント
抽象クラスのための動機は、クラスをオーバーライドするためにクライアントを必要とすることです。クラスは抽象クラスのユーザーだけが提供できるいくつかの基本的な動作が不足しているかどうかに主に依存抽象すべきか否かの決断ます。
あなたは通常、あなたが「この行動の穴にプラグが」彼のクラスのロジックを完了ある種のテンプレートメソッドを使用する場合は、抽象であるためにあなたのクラスを必要と伝えることができます。あなたのクラスには、いくつかのユーザ提供のロジックなしに有用であるならば、あなたはおそらく抽象するクラスを必要としません。
例として、フレームワークは通常表示、印刷、オブジェクトの状態の検証のようなものの面でそのユーザーに代わって決定を下すことができない、というように、彼らは、クライアントによって、具体的な実装に延期する必要があります。
あなたは仮想メソッドと抽象クラスの違いについて混乱して少ししているように聞こえます。あなたはそれが自分だ上で、それは意味がないと判断しない限り、抽象としてクラスをマークする必要はありません。これにより、複数のクラス間の行動を共有している可能性がある分野で有用である。
あなたのような私には音は普通のクラスと仮想しているいくつかの方法が必要になります。
は、抽象クラスと非抽象1との違いは、前者インスタンス化することはできません、それはオーバーライドされなければならないということです。これは、基底クラスのインスタンスは、独自に理にかなっているかどうかを判断するまで、あなたに本当にです。
私はあなたに2例をお見せしましょう。一つは、抽象クラスがそうでない感覚と一つになるところです。
public abstract class Animal {
public string Name {get;set;}
}
public class Dog : Animal {
public Bark(){}
}
public class Cat : Animal {
public Meaow(){}
}
は、このシナリオでは、Animal
プロパティの実装を提供する共通のベースName
を持っています。ただ動物であり、世界には動物が存在しないように、それは彼らが枯れ犬や猫や他の何かが、それ自体でインスタンス化動物には意味がありません。
ここでは、非抽象ベースを持っていることは理にかなってケースがある。
class Path {
public Path(IList<Point> points) {
this.Points = new ReadOnlyCollection<Point>(points);
}
public ReadOnlyCollection<Point> Points {get;}
}
class RectanglePath : Path{
public SquarePath (Point origin, int height, int width) :
base(new List<Point>{origin, new Point(origin.X + width, point.Y}, ....){
}
}
ここで作るセンスをサブクラス化されていないパス、我々は任意の形状を作成することができますが、より具体的な形状のためsublassを使用する方が便利かもしれません。