Encore une fois, j'espère vraiment que ce n'est pas une question d'opinion; J'essaie de savoir quelle est la meilleure façon de déterminer le type d'un objet qui appartient à une certaine hiérarchie en C#. J'ai deux façons de concevoir mon application:Détermination d'un type d'objet
1 - Utilisez une propriété sur la classe de base:
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 - utiliser l'opérateur
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);
}
Quels sont les implications de chaque alternative? Je pense que 2 a un plus grand impact sur les performances car il dépend des métadonnées, mais 1 semble beaucoup moins élégant. De plus, j'ai appris à faire ça en C++ ... Je ne suis pas sûr qu'il soit nécessaire de le faire avec C#.
EDIT 1:
J'ai ajouté le mot-clé override le code ci-dessus.
EDIT 2:
Je suis désolé, je l'ai sans doute pas moi-même clairement. Je vais illustrer mieux:
Par exemple, j'ai un objet WPF Panel
qui possède une propriété Children
, qui me retourne UIElement
s. J'ai besoin de savoir de quel type un certain élément est capable d'agir ... Dans mon cas particulier, l'utilisateur dessine un graphique sur l'écran, donc j'ai besoin de savoir combien de nœuds et combien de connexions sont dessinées pour stocker puis à la base de données. Je ne peux malheureusement pas utiliser le polymorphisme pour ça, n'est-ce pas? Comment saurai-je si je devrais ajouter une ligne à ma table de nœuds ou à ma table de connexions?
Ceci est une erreur de conception OO commune. Tu n'as pas besoin de ça. S'il vous plaît lire sur "polymorphisme", puis fermez la question. –
Il existe de nombreux exemples de la première façon dans le .NET Framework, par exemple, XmlDocument/XmlElement/..., XDocument/XElement/..., LambdaExpression/UnaryExpression/... – dtb
@ S.Lott: +1 :) (bla) – leppie