перегрузка против дженериков или полиморфизм - PullRequest
1 голос
/ 07 января 2011

Допустим, мы пытаемся написать вспомогательный метод расширения для добавления ячеек для 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 ]

5 голосов
/ 07 января 2011

Вы должны использовать три перегруженных метода, а третий должен принимать string вместо object.

Причины:

  1. Три перегрузки дают понять разработчику клиента, какие виды данных принимает метод.

  2. Функциональность проще расширять, добавляя больше перегрузок, не прерывая существующие вызовы методов в коде клиента.

  3. Ваша текущая реализация склонна вызывать ошибки, когда разработчики клиента случайно пропускают то, что они не имели в виду. Поскольку параметр object, компилятор не может проверить правильность типа. Лучше потребовать от клиента явного .ToString(), чтобы было ясно, что именно это и делается.

1 голос
/ 07 января 2011

Это больше похоже на случай, когда вы хотите предоставить перегруженные методы. Я говорю это, потому что вы не имеете дело с постоянным интерфейсом или чем-то, что может быть легко применено к генерикам. То есть то, что вы делаете с объектом cell, полностью зависит от того, что это такое. Для меня было бы более разумно перегружать метод AddCell для выполнения различных функций в зависимости от типа параметра. Кроме того, если вы имеете дело с конечным числом типов, о которых вы знаете во время компиляции, мне просто кажется, что работа с генериками излишне усложнит ситуацию.

...