继承一个类,但它通常是用静态方法创建的?

时间:2011-09-22 15:56:51

标签: c# inheritance

我有一个我想继承的课程。即ExpenseForm应该从Spreadsheet继承。电子表格由第三方提供:我无法改变它。

但是父类实例通常使用静态方法生成:

Spreadsheet myExpenses = Spreadsheet.Open(filename);

(并且Spreadsheet实现了iDisposable,所以上面的语句实际上位于使用部分的顶部,但我认为这不会影响到这一点。)

我想要

ExpenseForm myExpenses = ExpenseForm.Open(filename);

当然,这是失败的,因为ExpenseForm.Open(继承自Spreadsheet)会返回一个Spreadsheet对象。

解决这个问题的最佳方法是什么?也许扩展方法? (我没有经验。)

我走向了另一个方向; ExpenseForm现在有一个Spreadsheet实例。 (这感觉有点麻烦,因为当我完成时我必须跟踪我的一次性物体以便清理。)但似乎我错过了解决原始遗传问题的方法。

2 个答案:

答案 0 :(得分:1)

如果Spreadsheet个对象只能通过静态函数创建,则继承不是一个选项。只需在Open中提供自己的ExpenseForm静态函数,该函数将返回此类对象。

答案 1 :(得分:1)

您可以轻松地创建自己的ExpenseForm.Open方法:

public static new ExpenseForm Open(string file)
{
    // Do whatever you need
}

假设您可以创建一个子类,即您可以链接到适当的构造函数。你说你通常使用Spreadsheet.Open,但是那里有受保护的或公共构造者吗?

我个人也赞成合成路线 - 你真的希望其他代码将ExpenseForm视为任何其他类型的Spreadsheet吗?我通常更喜欢构图而不是继承 - 根据我的经验,它使代码更易于推理。