【问题标题】:Derive abstract class from non-abstract class从非抽象类派生抽象类
【发布时间】:2010-04-08 19:12:56
【问题描述】:

可以从非抽象类派生抽象类还是这种方法有问题?

这是一个小例子:

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​​ 的派生类。

【问题讨论】:

  • 完美的问题 Jehof!

标签: c# .net inheritance abstract


【解决方案1】:

我认为这种方法没有任何问题。

你可能有一些可以用具体术语来描述的基本类型。现在,仅仅因为这种类型的对象可以根据某个子类型进一步分类,并不意味着所有这些子类型都一样具体;反过来,它们可能需要进一步具体化。

现实世界的例子:

Person -- 混凝土(非抽象)
Sibling: Person -- 抽象
Brother: Sibling -- 混凝土
Sister: Sibling -- 具体的

【讨论】:

  • 你也可以用abstract 覆盖一个具体的(但虚拟的)方法。示例public abstract override string ToString();abstract 覆盖System.Object 中的具体ToString()。这会强制所有派生类提供新的实现。
【解决方案2】:

没有错。

如果你看一下像 WinForms 这样的大层次结构,你会发现有好几层抽象类型。

MSBuild 任务也是一个很好的(并且更相关的)示例。

【讨论】:

    【解决方案3】:

    这种事情一直在发生:所有的抽象类都继承自System.Object,而这个类本身并不是abstract

    new System.Object() 有时对锁定很有用,如果你周围没有其他东西,你可以锁定。

    【讨论】:

    • 这是一个好点。我错过了这个事实,因为不能明确设置从 System.Object 的继承。
    【解决方案4】:

    在这里使用抽象不是正确的方法,例如,使用受保护的或内部构造函数。这将阻止直接创建 PeriodicalTask​​ 的实例,但其派生类仍然可以访问它。

    【讨论】:

    • 您能详细说明一下吗?是的,受保护的/内部构造函数可以防止 PeriodicalTask 的实例被定向创建。但它也需要来自Task 的任何抽象方法/属性来实现。
    • 没关系...我错过了 Task 不是抽象的。在这种情况下,这两种方法都同样有效。除此之外,您不能强迫某人在派生类中实现方法。
    • @kprobst:是的,我可以做到,但是我失去了定义必须由派生类型实现的抽象成员的可能性。虚拟成员不是选项,因为派生类型必须定义它们的工作方式
    猜你喜欢
    • 2011-02-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多