Поделиться свойствами среди нескольких классов - PullRequest
1 голос
/ 03 июня 2009

У меня есть класс с несколькими свойствами A, B, C. Я рассматриваю это как входной объект, поскольку использую его в логике для запуска некоторых правил, основанных на значениях этих свойств. Теперь, после выполнения правил, я создал другой класс в качестве выходных данных с теми же свойствами и с теми же значениями в дополнение к нескольким другим свойствам, специфичным для выходных данных.

Теперь мой вопрос заключается в том, как мне совместно использовать эти свойства (A, B, C) как для входных, так и для выходных классов, без необходимости вручную присваивать значение из входных данных выходным. Можете ли вы предложить мне эффективный дизайн, который мне нужно использовать? Разве абстрактное понятие класса входит в картину здесь? Или есть другой эффективный способ?

Ответы [ 5 ]

0 голосов
/ 03 июня 2009

Не зная больше, я думаю, что наследование и полиморфизм - это путь:

class input 
{
   public int A { get; set;}
   public int B { get; set;}
   public int C { get; set;}
}

class output : input {
   public int D { get; set;}
   public int E { get; set;}
   public int F { get; set;}
}

Вы просто делаете:

void main()
{
    output tpt = new output();
    tpt.A = 3;
    tpt.B = 2;
    tpt.C = 4;

    tpt = dosomething((input)tpt);
}

public output dosomething(input inpt)
{
    //blablabla
    output tpt = (output)inpt;
    tpt.D = 1;
    tpt.E = 2;
    tpt.F = 3;

    return tpt;
}
0 голосов
/ 03 июня 2009

Опции - синглтон - работает, но зависит от сценариев повторного использования. Используете ли вы какой-либо тип фабрики или шаблон экземпляра, кроме "new MyObj ()"? если это так, завод может выполнить работу, что приводит к следующему методу - инъекции. Поддерживает ли ваш язык инъекции или что-то в этом роде (иначе - весна). Вы можете определить метод установки, но оставить его на усмотрение структуры внедрения или / или заводских методов для обработки / выполнения настройки - опять же, зависит от вариантов использования.

Если это основано на времени выполнения, вам нужно будет использовать состав - делегировать либо ссылку на исходные объекты, либо промежуточный объект (который, в свою очередь, оборачивает A, B C и т. Д.).

Возможно, немного осталось от поля, но я предполагаю, что ваш вопрос - простой случай, чтобы получить некоторые предложения для более крупной проблемы.

Являются ли свойства динамическими - время компиляции или время выполнения? они собираются измениться (т. е. обрабатывать динамические обновления из базы данных). Вам нужно запустить в тестовом сборе или с фиктивными значениями, а затем протестировать в контексте полного приложения?

0 голосов
/ 03 июня 2009

Рассматривали ли вы использовать синглтон шаблон проектирования? Я не знаком со спецификацией вашего проекта, но похоже, что он может помочь вам или, по крайней мере, даст вам направление.

0 голосов
/ 03 июня 2009

Вы можете определить неявный оператор (C #) для выходного класса следующим образом:

public static implicit operator OutputClass(InputClass m) 
{
   this.A = m.A;
   this.B = m.B;
   this.C = m.C;
}

Тогда все, что вам нужно сделать, это:

output = input;

и вы фактически перенесете все данные из входных данных, которые вы хотите получить в выходных данных.

0 голосов
/ 03 июня 2009

Используйте промежуточный класс, который имеет только свойства, а затем получите доступ к экземпляру этого класса из ваших входных и выходных объектов, однако в большинстве случаев было бы проще скопировать значения из вашего ввода в ваш вывод.

...