Представьте себе класс, который можно, в принципе, создать, указав значение одного из двух свойств, оба из которых имеют один и тот же тип. Следующий код выполняет это, используя комбинацию named and optional parameters различать между двумя конструкторами:Использование Именованных и необязательных аргументов для различения конструкторов
class Program
{
static void Main()
{
//Note: these 2 ctors are distinguished only by the argument naming convention:
thing thingWithMass = new thing(mass: 10);
thing thingWithVolume = new thing(vol: 25);
}
class thing
{
int Density = 3;
int Mass;
int Vol;
public thing(int mass)
{
Mass = mass;
Vol = Mass/Density;
}
// Note the use of the optional variable to distinguish this ctor:
public thing(int vol, bool isVol=true)
{
Vol = vol;
Mass = Vol * Density;
}
}
}
Так (несколько неожиданно) этот код компилируется и работает отлично, но это плохой форме? Кажется, это немного похоже на обман, и мне интересно, существует ли скрытая опасность, которая мне не кажется очевидной? Он пахнет?
ПРИМЕЧАНИЕ: В данном конкретном случае, я понимаю, что я мог бы достичь по существу то же самое с одним конструктором, который выглядит следующим образом:
public thing(int mass=0, int vol=0) //plus a couple of if() statements in the body
но в моей реальной ситуации есть немало других параметров, участвующих , и объединение их всех в один конструктор становится немного громоздким и трудно читаемым.
Я бы сказал, что это немного пахнет. Любой, кто использует этот класс, должен был бы знать, как работать с этим обманом, или они могут закончиться неожиданными результатами. – JLRishe
Я думаю, было бы лучше показать ваш реальный код, потому что прямо сейчас я чувствую, что спрашиваю, почему вы даже делаете класс (ссылочный тип btw), чтобы обернуть целочисленное значение. – Crono
@Crono: мой класс намного сложнее этого; для этого примера я просто удалил все, что не было необходимо для демонстрации логики конструктора. – kmote