je suivre des cours:C# - classe générique à jeter sa classe de base non générique
public abstract class CustomerBase
{
public long CustomerNumber { get; set; }
public string Name { get; set; }
}
public abstract class CustomerWithChildern<T> : CustomerBase
where T: CustomerBase
{
public IList<T> Childern { get; private set; }
public CustomerWithChildern()
{
Childern = new List<T>();
}
}
public class SalesOffice : CustomerWithChildern<NationalNegotiation>
{
}
Le SalesOffice est juste l'un des rares classes qui représentent différents niveaux de la hiérarchie des clients. Maintenant, je dois parcourir cette hiérarchie à partir d'un certain point (CustomerBase). Je ne peux pas comprendre comment mettre en œuvre sans utiliser la réflexion. Je voudrais mettre en œuvre quelque chose comme:
public void WalkHierarchy(CustomerBase start)
{
Print(start.CustomerNumber);
if (start is CustomerWithChildern<>)
{
foreach(ch in start.Childern)
{
WalkHierarchy(ch);
}
}
}
Y at-il une chance que je pourrais obtenir quelque chose comme cela fonctionne?
La solution basée sur l'interface proposée a-childern I mis en œuvre:
public interface ICustomerWithChildern
{
IEnumerable ChildernEnum { get; }
}
public abstract class CustomerWithChildern<T> : CustomerBase, ICustomerWithChildern
where T: CustomerBase
{
public IEnumerable ChildernEnum { get { return Childern; } }
public IList<T> Childern { get; private set; }
public CustomerWithChildern()
{
Childern = new List<T>();
}
}
public void WalkHierarchy(CustomerBase start)
{
var x = start.CustomerNumber;
var c = start as ICustomerWithChildern;
if (c != null)
{
foreach(var ch in c.ChildernEnum)
{
WalkHierarchy((CustomerBase)ch);
}
}
}
C'est la meilleure solution car il encapsule la mise en œuvre de la marche et fait exactement la bonne chose sans forcer l'appelant à être au courant des détails de mise en œuvre. – recursive
Des éloges de la part de quelqu'un nommé "récursif". ;-) –
Mon dernier grand projet .NET avait une exigence similaire, et John Saunders est comme moi. Fait beaucoup de choses tellement plus facile :) – OregonGhost