Опять же, я действительно надеюсь, что это не вопрос мнения; Я пытаюсь узнать, какой из них лучше всего определить тип объекта, принадлежащего определенной иерархии на C#. У меня есть два пути для разработки моего приложения:Определение типа объекта
1 - использовать свойство в базовом классе:
public abstract class Parent
{
public abstract TypeOfObject TypeOfObject { get; }
}
public class Child1 : Parent
{
public override TypeOfObject TypeOfObject { get { return TypeOfObject.Child1 } }
// ...
}
public class Child2 : Parent
{
public override TypeOfObject TypeOfObject { get { return TypeOfObject.Child2 } }
// ...
}
public enum TypeOfObject
{
Child1,
Child2
}
public static void Main()
{
Parent p = new Child1();
switch (p.TypeOfObject)
{
case TypeOfObject.Child1: _doSomethingWithChild1(p);break;
case TypeOfObject.Child2: _doSomethingWithChild2(p);break;
}
}
2 - Используйте это оператор
public abstract class Parent
{
// ...
}
public class Child1
{
// ...
}
public class Child2 : Parent
{
// ...
}
public enum TypeOfObject
{
Child1,
Child2
}
public static void Main()
{
Parent p = new Child1();
if (p is Child1) _doSomethingWithChild1(p);
if (p is Child2) _doSomethingWithChild2(p);
}
Каковы последствия каждой альтернативы? Я думаю, что 2 имеет более высокий рейтинг производительности, поскольку он опирается на метаданные, но 1 кажется менее элегантным. Кроме того, я научился делать это 1 путь в C++ ... Я не уверен, что это необходимо сделать с C#.
EDIT 1:
Я добавил переопределения ключевое слово в коде выше.
EDIT 2:
извини, я, наверное, не сделал себе ясно. Я проиллюстрирую это лучше:
Например, у меня есть WPF Panel
объект, который имеет Children
свойство, которое возвращает мне UIElement
с. Мне нужно знать, к какому типу должен действовать определенный элемент ... в моем конкретном случае пользователь рисует график на экране, поэтому мне нужно знать, сколько узлов и сколько соединений выполняется для хранения затем в базе данных. Я не могу, к сожалению, использовать для этого полиморфизм, верно? Как узнать, следует ли добавить строку в таблицу узлов или таблицу соединений?
Это обычная ошибка дизайна OO. Вам это не нужно. Пожалуйста, прочитайте «полиморфизм», а затем закройте вопрос. –
Есть много примеров первого пути в .NET Framework, например XmlDocument/XmlElement/..., XDocument/XElement/..., LambdaExpression/UnaryExpression/... – dtb
@ S.Lott: +1 :) (blah) – leppie