重载vs泛型或多态

时间:2011-01-06 23:37:34

标签: c# oop generics polymorphism overloading

假设我们正在尝试编写辅助扩展方法来为asp.net添加单元格。 Asp.net TableCell控件只有一个默认构造函数,在处理高度自定义数据时可能很麻烦(忽略这个问题的根本缺陷与问题无关)。

多晶型溶液

public static void AddCell(this Table table, object cell) {
    TableCell tableCell;
    if (cell is TableCell) {
        tableCell = (TableCell)cell;
    } else if (cell is WebControl) {
        tableCell = new TableCell();
        tableCell.Controls.Add((WebControl)cell);
    } else {
        tableCell = new TableCell();
        tableCell.Text = cell.ToString();
    }
    table.Rows[table.Rows.Count - 1].Cells.Add(tableCell);
}

问题

这可以作为通用方法或多个方法重载更好地实现吗?

2 个答案:

答案 0 :(得分:5)

您应该使用三种重载方法,第三种方法应该使用string而不是object

原因:

  1. 这三个重载让客户端开发人员明白了该方法接受哪种数据。

  2. 通过添加更多重载来扩展功能更容易,而不会破坏客户端代码中对方法的现有调用。

  3. 当客户端开发人员意外传递他们不想要的东西时,您当前的实现很容易导致错误。由于参数为object,编译器无法检查类型的正确性。最好是要求客户端明确.ToString(),明确表示这是完成的工作。

答案 1 :(得分:1)

这看起来更像是您想要提供重载方法的情况。我这样说是因为你没有处理一个恒定的界面或者可以很容易地应用于泛型的东西。也就是说,你对cell对象的处理完全取决于它是什么。对我来说,重载AddCell方法以根据参数类型执行不同的功能会更有意义。此外,如果您在编译时处理有限数量的类型,那么在我看来,使用泛型会不必要地使事情变得复杂。