Передача информации о типах объектов из пользовательского интерфейса на уровень данных - PullRequest
1 голос
/ 20 января 2012

У меня есть объект данных, у которого есть базовый класс с тремя производными классами,

public enum ModelType
{
   A,
   B, 
   C
}
public abstract class Parent
{
   protected ModelType type; 
}

public class ChildA: Parent
{
    private new ModelType type = ModelType.A;
}

public class ChildB: Parent

public class ChildC: Parent

Такое же поле type находится в двух других дочерних элементах с соответствующими ModelType s.

У меня есть другой слой между формами, который имеет некоторую дополнительную информацию об объекте данных более высокого уровня и экземпляр Parent().Я пытаюсь значительно упростить проблему, поэтому я прошу прощения, если я не ясен и не дал достаточно информации.

public enum UIModelType
{
   A,
   B, 
   C,
   None
}
public class DataObject
{
    private Parent someData;
    private UIModelType type;
}

Поля имеют свойства getter и setter.

Пользовательский интерфейстолько связывается с классом DataObject и не может видеть объект someData нижнего уровня.

Теперь в какой-то момент во время пользовательского интерфейса (который является мастером для заполнения информации в объектах данных) пользовательМожно выбрать A, B или C.Моя проблема в том, как передать эту информацию без слишком большого количества повторений кода.Прямо сейчас у меня есть перечисление между UI и DataObject классом.Поэтому, если пользователь выбирает A, он назначает тип данных как A, используя перечисление.Класс DataObject теперь создает экземпляр объекта someData с ChildA().Проблема состоит в том, чтобы связываться между объектом DataObject и someData. У меня есть другое перечисление с A, B и C. Для связи с типом.

Было бы лучше использовать typeof вместо этого, хотя я читал, чтоэто не лучший путь.

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

Ответы [ 3 ]

0 голосов
/ 20 января 2012

Просто используйте «typeof» и покончите с этим.Похоже, вы используете только перечисления из-за небольшого увеличения производительности, которое вы могли бы получить.Просто делайте то, что дает самый легкий для чтения / поддержки код (в данном случае typeof).

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

0 голосов
/ 20 января 2012

Я бы избавился от ModelType. Вы просто создаете другой способ представления информации, которая у вас уже есть, и это будет раздражать.

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

if (this.someData is ChildA) {

} else if (this.someData is ChildB) {

} ...
0 голосов
/ 20 января 2012

Вместо использования typeof или enum вы можете использовать is.

private Parent someData = new ChildA();

if (someData is Parent) { } // Returns true.
if (someData is ChildA) { } // Returns true.
if (someData is ChildB) { } // Returns false.

Однако, если я правильно понимаю ваш вопрос, похоже, что вы делаете эти проверки, потому что вынеобходимо постоянно понижать объект someData, чтобы обеспечить функциональность класса DataObject, который зависит от типа someData.Если это так, вы можете подумать о рефакторинге своего кода, так как повторное снижение производительности может затруднить чтение кода и не поддается некоторым традиционным концепциям объектно-ориентированного программирования.Хорошо, я думаю, что теперь понимаю ваш вопрос лучше.Вы ищете лучший способ создания дочерних элементов объекта Parent (т.е. с использованием фабричного шаблона), чем с помощью enum.

. Вы можете создать экземпляр динамически на основе имени типа:

var typeName = GetTheTypeTheUserWants();
var type = System.Type.GetType(typeName, false, true);
if (type == null) throw new Exception();

var someData = Activator.CreateInstance(type) as Parent;
if (someData == null) throw new Exception();

Использование enum может быть проще, но этот метод позволяет создавать новые подклассы Parent без обновления вашего enum.

Если я все еще пропустил пунктвашего вопроса, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...