Независимо от того, говорите вы о конструкторах или нет, перегрузка довольно ограничена, и когда вы начинаете сталкиваться с ее ограничениями, это намек на то, что это не тот инструмент для работы.
Стоит посмотретьв хорошо разработанном API, который использует перегрузку, чтобы понять, для какой работы подходит этот инструмент.XmlReader.Create
является хорошим примером: он поддерживает двенадцать различных перегрузок.Двенадцать!И все же, это на самом деле совершенно разумно: когда вы смотрите на них все, они сводятся к тому, что в Python будет единственной вызывающей сигнатурой с необязательными параметрами:
XmlReader.Create(input [, settings [, parser_context]])
input
для этого метода, может быть строкой, содержащей URL или имя файла, TextReader
или Stream
.Но независимо от типа данных, это по сути одно и то же: источник данных, которые XmlReader
будет читать.
Теперь давайте рассмотрим ваш случай.Забудьте о типах данных на мгновение.Очевидно, что в вашем приложении есть некоторая функциональная разница между status
и idCode
.Ваша форма будет вести себя в одном направлении, если ей дано status
, а в другом - если ей дано idCode
.API, который вы предлагаете , скрывает эту функциональную разницу.Это должно быть с подсветкой it.
Сначала я бы рассмотрел самый простой из возможных подходов, который вообще не использует перегрузок:
TheForm(string idCode, string status)
Заставьте ваш конструктор вызвать исключение, еслиоба значения предоставляются (или если оба являются нулевыми).Обратите внимание, что они взаимоисключающие в документации.Назовите это днем.
Мой второй выбор будет следующим:
enum FormType
{
IdCode,
Status
};
TheForm(FormType type, string data)
Это менее лаконично, но имеет очень большую ценность того, что этот метод поддерживает несколько взаимоисключающихрежимы явные.
Я назвал это перечисление FormType
, потому что оно казалось разумным именем, учитывая то, что я знаю до сих пор, и тот факт, что этот метод является конструктором.Но всякий раз, когда вы задумываетесь о создании перечисления для определения типа экземпляра, вы должны, по крайней мере, учитывать возможность создания типа для определения типа экземпляра:
class TheFormWhatUsesIdCode : TheForm {...}
class TheFormWhatUsesStatus : TheForm {...}
Функциональная разница между idCode
и status
, вероятно, связана с функциональной разницей между формой, созданной с помощью idCode
, и формой, созданной с помощью status
.И это настоятельно предполагает, что они должны быть подклассами.
Во всем этом анализе я ни разу не рассматривал возможность сделать то, что вы на самом деле просили, то есть обеспечить несколько перегрузок.Я не думаю, что перегрузка является правильным инструментом для этой работы.Если бы idCode
были int
, а status
были string
I все еще , я бы не подумал, что перегрузка была подходящим инструментом для этой работы, хотя я, вероятно, не заметил быдо тех пор, пока у меня не будет много кода, необходимого для рефакторинга.