我有一个我想继承的课程。即ExpenseForm应该从Spreadsheet继承。电子表格由第三方提供:我无法改变它。
但是父类实例通常使用静态方法生成:
Spreadsheet myExpenses = Spreadsheet.Open(filename);
(并且Spreadsheet实现了iDisposable,所以上面的语句实际上位于使用部分的顶部,但我认为这不会影响到这一点。)
我想要
ExpenseForm myExpenses = ExpenseForm.Open(filename);
当然,这是失败的,因为ExpenseForm.Open(继承自Spreadsheet)会返回一个Spreadsheet对象。
解决这个问题的最佳方法是什么?也许扩展方法? (我没有经验。)
我走向了另一个方向; ExpenseForm现在有一个Spreadsheet实例。 (这感觉有点麻烦,因为当我完成时我必须跟踪我的一次性物体以便清理。)但似乎我错过了解决原始遗传问题的方法。
答案 0 :(得分:1)
如果Spreadsheet
个对象只能通过静态函数创建,则继承不是一个选项。只需在Open
中提供自己的ExpenseForm
静态函数,该函数将返回此类对象。
答案 1 :(得分:1)
您可以轻松地创建自己的ExpenseForm.Open
方法:
public static new ExpenseForm Open(string file)
{
// Do whatever you need
}
假设您可以创建一个子类,即您可以链接到适当的构造函数。你说你通常使用Spreadsheet.Open
,但是是那里有受保护的或公共构造者吗?
我个人也赞成合成路线 - 你真的希望其他代码将ExpenseForm
视为任何其他类型的Spreadsheet
吗?我通常更喜欢构图而不是继承 - 根据我的经验,它使代码更易于推理。