【问题标题】:overloading vs generics or polymorphism重载与泛型或多态性
【发布时间】:2011-01-06 23:37:33
【问题描述】:

假设我们正在尝试编写一个辅助扩展方法来为 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);
}

问题

这会更好地实现为泛型方法还是多个方法重载?

【问题讨论】:

  • 您的“多态”解决方案不是多态的。
  • 当你最关心对象的字符串表示时,它们都覆盖了 ToString 成员。不是一般意义上的多态,我同意。

标签: c# oop generics polymorphism overloading


【解决方案1】:

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

原因:

  1. 这三个重载让客户端开发人员清楚地知道该方法接受哪些类型的数据。

  2. 通过添加更多重载而不中断对客户端代码中现有方法的调用,可以更轻松地扩展功能。

  3. 当客户端开发人员不小心传递了他们无意传递的内容时,您当前的实现很容易导致错误。由于参数是object,编译器不可能检查类型的正确性。最好在客户端要求明确的.ToString() 以明确表明这是正在执行的操作。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 2011-07-10
      • 2012-04-12
      • 2012-01-20
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多