Конструкторы с такими же аргументами? - PullRequest
3 голосов
/ 15 сентября 2011

У меня есть WinForm, которую я хочу создать, используя два разных значения идентификатора.Например:

var f1 = new Form(table1Id);
var f2 = new Form(table2Id);

Первый конструктор построит форму на основе данных в таблице1, второй конструктор построит форму на основе данных в таблице2.Проблема в том, что если у меня есть два конструктора, которые принимают целое число, то нет различия между ними.Как лучше всего решить эту проблему?

Ответы [ 5 ]

4 голосов
/ 15 сентября 2011
class MyForm : Form
{
    public MyForm(int id)
    {
         // logic to distinguish id goes here
    }
}
4 голосов
/ 15 сентября 2011

Рассмотрим фабричный подход вместо конструктора. Именованные методы - это способ устранения неоднозначности, когда типы параметров одинаковы, но означают разные вещи. Например

public static Form CreateFromTable1(int id)
{
    // instantiate, build form
    return form;
}

public static Form CreateFromTable2(int id)
{
    // instantiate, build form
    return form;
}
2 голосов
/ 15 сентября 2011

Без просмотра кода это трудно подтвердить, но по вашим объяснениям этот класс нарушает принцип единой ответственности.

Если предположить, что формы отличаются только данными, пусть конструктор получит фактические данные вместо идентификаторов, которые, как я полагаю, используются для получения данных.

Если они существенно различаются по содержанию, они должны быть двух разных форм (возможно с общим абстрактным родительским классом).

Исходя из моего прошлого опыта, наличие этой единой формы для управления ими всеми менталитетом просто создаст кошмар обслуживания. Потратьте некоторое время на изучение принципов SOLID (S = принцип единой ответственности), и вы будете приятно удивлены кодом, который начинаете писать.

0 голосов
/ 15 сентября 2011

В этом случае я бы создал Enum и передал бы одно из его значений в качестве аргумента, указывающего, какой тип таблицы дан.

0 голосов
/ 15 сентября 2011

Я бы использовал метод Initialize, что-то вроде:

var f1  = new Form();
f1.InitA(table1Id);
var f2  = new Form();
f2.InitB(table2Id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...