2009-02-25 3 views
3

Je suis sûr que je suis en train de déconner avec beaucoup de casting et tel dans ce code ci-dessous. Il semble qu'il devrait y avoir une façon plus douce. Essentiellement, j'essaie d'utiliser une méthode de construction (CreateNewPattern) pour gérer la création de nouveaux objets du type de sous-classe transmis (par les méthodes CreateNewCircularPattern et CreateNewLinePattern). Je n'ai actuellement que deux types sous-classifiés CircularHolePattern et SingleLineHolePattern qui héritent de HolePattern, mais je m'attends à en avoir plus au fur et à mesure que mon application se développe.Création et initialisation de différents sous-types sans beaucoup de coulée

Est-ce un endroit pour utiliser un délégué ou un lambda? Il n'en sait rien, alors soyez aussi précis que possible avec des suggestions de code.

private CircularHolePattern CreateNewCircularPattern() 
{ 
    var CreatedPattern = CreateNewPattern(typeof(CircularHolePattern)); 
    return (CircularHolePattern)CreatedPattern; 
} 


private SingleLineHolePattern CreateNewLinePattern() 
{ 
    var CreatedPattern=CreateNewPattern(typeof(SingleLineHolePattern)); 
    return (SingleLineHolePattern)CreatedPattern; 
} 

private HolePattern CreateNewPattern(Type PatternTypeToCreate) 
{ 
    var NewHolePattern = (HolePattern)Activator.CreateInstance(PatternTypeToCreate); 
    NewHolePattern.PatternName = "Pattern #" + (HolePatterns.Count + 1).ToString(); 
    this.AddPattern(NewHolePattern); 
    this.SetActivePattern(NewHolePattern); 
    return NewHolePattern; 
} 
+0

(commentaire Ajouté (s) re votre question) –

Répondre

6

Je suppose que vous voulez génériques:

private T CreateNewPattern<T>() where T : HolePattern, new() 
{ 
    var newHolePattern = new T(); 
    newHolePattern.PatternName = "Pattern #" + 
     (HolePatterns.Count + 1).ToString(); 
    this.AddPattern(newHolePattern); 
    this.SetActivePattern(newHolePattern); 
    return newHolePattern;   
} 

private SingleLineHolePattern CreateNewLinePattern() { 
    return CreateNewPattern<SingleLineHolePattern>(); 
} 

private CircularHolePattern CreateNewCircularPattern() { 
    return CreateNewPattern<CircularHolePattern>(); 
} 

Le T est le type argument générique; le type que nous voulons créer. Le where indique "il doit être HolePattern ou un sous-type, et il doit avoir un constructeur public sans paramètre" - ceci nous permet d'utiliser new T() pour en créer une nouvelle instance, et accéder à tous les membres de HolePattern par rapport à de telles instances (PatternName). Cela nous permet également d'appeler les méthodes qui acceptent un HolePattern en tant qu'argument.

+0

Je peux certainement suivre ce que les médicaments génériques est en train de faire ici. Cependant, permettez-moi de demander, respectueusement, parce que je suis un débutant à C# (venant principalement de FoxPro), puisque je veux développer de bonnes pratiques et une compréhension que je peux posséder avec conviction, alors, qu'est-ce que j'ai vraiment gagné dans le monde? cette approche? – MattSlay

+0

Une chose est le type de sécurité; vous ne pouvez pas appeler 'CreateNewPattern ', mais vous pouvez appeler 'CreateNewPattern (typeof (int))'; il sait que T est un HolePattern avec un constructeur utilisable. Une seconde est que vous n'avez plus de casting - le compilateur peut prouver que vous faites les choses correctement. –

+0

Selon votre point de vue, vous avez également supprimé toutes les fonctionnalités utiles de 2 méthodes: CreateNewLinePattern/CreateNewCircularPattern - vous pouvez même les supprimer complètement et demander à l'appelant d'utiliser CreateNewPattern () etc; moins de code à maintenir. –

0

Pour un, vous pouvez réduire les ... Créer des méthodes de modèle pour

private CircularHolePattern CreateNewCircularPattern() 
{ 
    return CreateNewPattern(typeof(CircularHolePattern)); 
} 

Une autre suggestion pourrait être seulement le travail dans les abstractions. Par exemple, renvoyez uniquement les types HolePattern à partir des méthodes Create ... Pattern au lieu de leurs types concrets tels que CircularHolePattern. Vous les rejetez dans HolePattern dans tous les cas.

Ainsi, CreateNewCircularPattern devient

private HolePattern CreateNewCircularPattern() 
{ 
    return CreateNewPattern(typeof(CircularHolePattern)); 
}