2009-03-17 6 views
2

Hier ist die Situation, für die ich versuche, ein passendes Design zu finden.OOGenerics Design Überlegungen

Ich muss Profile von Zahlen speichern. Ein Profil ist nur eine Reihe von Zahlen. Sie können entweder vom Typ int, float oder decimal sein. Jedes Profil hat ein ProfileDescription-Feld basierend auf einer Enumeration.

Jedes Profil enthält eine Sammlung von ProfileVersion-Objekten. Jedes ProfileVersion-Objekt verfügt über eine Auflistung von ProfileValue-Objekten. In diesen ProfileValue-Objekten werden die tatsächlichen numerischen Werte des erforderlichen Typs gespeichert.

Meine ursprüngliche Entwurfsidee bestand darin, Profile, ProfileVersion und ProfileValue generisch zu machen. Ich habe ein Problem, wenn ich eine Liste von Profilen verschiedener Typen haben möchte, die ich nicht haben kann. Ich könnte stattdessen eine ArrayList verwenden, aber dann müsste ich die Daten darin auswerfen.

Obwohl es möglich sein könnte, nur ProfileVersion und ProfileValue generisch zu machen, und dann das Profile Object zuweisen einen Typ der ProfileVersion abhängig von dem Wert des ProfileDescription Feld, aber ich kann keinen Weg finden, dies zu tun. Ein anderer Gedanke war, dass ich eine ProfileBase-Klasse verwenden und dann entweder mit GenericProfileClass oder IntProfile, FloatProfile und DecimalProfile ableiten sollte, aber das würde mir keinen Vorteil verschaffen, dass jede Klasse generisch ist, wie ich müsste streiche die Unterklasse jedes Mal aus.

Ich würde Ihre Gedanken über die beste Design-Ansatz für diese Situation zu schätzen wissen.

Dank

Antwort

2

Grzenios Idee ist richtig. Jeder Ihrer Profilklassen gemacht werden könnte, um sein Implementierungen eines IProfile Objekt, und dann könnte Ihre Behälter sein:

class ProfileList : IList<T> where T: IProfile 

So ist die einzige Einschränkung Sie haben müssen, ist die Schnittstelle, nicht die spezifische Art oder eine gegossene Basis Klasse.

Was:

Ein anderer Gedanke war sollte ich eine Profile Klasse verwenden und es dann Unterklasse entweder mit einem GenericProfileClass oder IntProfile, FloatProfile und DecimalProfile, aber dies würde nicht wirklich geben Sie mir keinen Vorteil gegenüber , wobei jede Klasse generisch ist, da I jedes Mal die Unterklasse auswerfen müsste.

Die Vorteile hängen wirklich von der Ebene der Abstraktionen ab, die Sie für Ihre Klassen vornehmen. Wenn Sie richtig entworfen werden, können Sie idealerweise Betriebs/Geschäftslogik-/oder Manager-Klassen haben, die alle diese Basistypen akzeptieren können (wiederum über Generika), ohne die spezifische Besetzung kennen zu müssen.

1

Ich bin nicht sicher, ob ich das Problem richtig verstanden (den Code einfügen, die nicht helfen würde, funktioniert), aber ich denke, dass Sie IProfile Schnittstellen zu schaffen versuchen könnten, IProfileVersion etc. und machen Die generische Klasse erbt die Schnittstelle .

Was Sie versuchen, in nicht einfach trotzdem zu tun, weil es in C# leider keinen Basis-numerischen Typ gibt.

Verwandte Themen