43

非抽象クラスから抽象クラスを派生させても大丈夫ですか、それともこのアプローチに何か問題がありますか?

ここにちょっとした例があります:

public class Task {
  // Some Members
}

public abstract class PeriodicalTask : Task {
  // Represents a base class for task that has to be done periodicaly.
  // Some additional Members
}

public class DailyTask : PeriodicalTask {
  // Represents a Task that has to be done daily.
  // Some additional Members
}

public class WeeklyTask : PeriodicalTask {
  // Represents a Task that has to be done weekly.
  // Some additional Members
}

上記の例では、Task クラスを直接インスタンス化したいので、クラスを抽象化したくありません。PeriodicalTask​​ は Task から機能を継承し、いくつかの追加メンバーを追加する必要がありますが、直接インスタンス化したくありません。PeriodicalTask​​ の派生クラスのみをインスタンス化する必要があります。

4

4 に答える 4

59

このアプローチに問題はないと思います。

具体的な言葉で説明できる基本的なタイプがあるかもしれません。さて、このタイプのオブジェクトがいくつかのサブタイプに従ってさらに分類される可能性があるからといって、そのようなすべてのサブタイプが同じように具体的であるということにはなりません。いわば、さらに具体化する必要があるかもしれません。

実際の例:

Person--コンクリート(非抽象)
Sibling: Person--抽象
Brother: Sibling--コンクリート
Sister: Sibling--コンクリート

于 2010-04-08T19:16:58.693 に答える
18

それは何も悪いことではありません。

WinForms のような大きな階層を見ると、抽象型のいくつかのレイヤーが見つかります。

MSBuild タスクも良い (より関連性の高い) 例です。

于 2010-04-08T19:16:09.787 に答える
16

この種のことは常に起こります。すべての抽象クラスは、それ自体System.Objectではないクラスから継承しabstractます。

new System.Object()周りに何もない場合は、ロックすることができます。

于 2010-04-08T19:18:21.233 に答える
0

ここで抽象を使用することは正しいアプローチではありません。たとえば、保護されたコンストラクターまたは内部コンストラクターを使用してください。これにより、PeriodicalTask​​ のインスタンスを直接作成することはできなくなりますが、その派生クラスは引き続きそれにアクセスできます。

于 2010-04-08T19:15:47.993 に答える