Enum der Basisklasse wie erweitern?

28/08/2007 - 12:41 von Georg Gungl | Report spam
Hallo NG,

irgendetwas mache ich bestimmt falsch,
denn so kompliziert ist die Sache garnicht.

Habe 3 Basis-Klassen und 3 Enums als Vorlage um Datenstrukturen zu
modellieren erstellt.
Vereinfacht dargestellt etwa so:

<code>
namespace BlaBla.DataStructs
{
public enum EFields
{
Default,
// usw.
}

public enum EPolicies
{
Default,
// usw.
}

[System.Flags]
public enum EBlocks
{
None = 0,
Default = 1,
// usw.
}

public class FixLenghtDs
{
protected List<DsField> m_Fields;
protected List<DsPolicy> m_Policies;

// ...

/// <summary>
/// Beispiel-Methode #1 für Enum-Problem
/// Elemente anhand Enum-Kodierung suchen
/// </summary>
public DsField GetField(EFields fieldCode)
{
return this.Fields.Find(
delegate(Feld f)
{
return (f.Code == fieldCode);
}
);
}

// ...
}

public class DsField
{
// ...

private EFields m_Code;

// ...

public DsField(EFields code,
EBlocks blocks,
uint lenght,
uint subFieldsCount)
{
m_Code = code;
// ...
}

// ...

public EFields Code
{
get
{
return m_Code;
}
}

// ...
}

public class DsPolicy
{
private EPolicies m_Code;
private EBlocks m_Blocks;

// ...

/// <summary>
/// Beispiel-Methode #2 für Enum-Problem
/// Element-Liste anhand Enum-Kodierung filtern
/// </summary>
public List<DsField> GetFields(List<DsField> allFields)
{
// Block-Zugehörigkeit der Felder und Verfahren
// vergleichen, neue Liste mit Treffer als result
}

// ...
}
}
<\code>

Daraus sollte im Idealfall durch Erweiterung der Enum-Kodierungslisten
bzw. InitFields/InitPolicies etwas Formatspezifisches entstehen:

<code>
namespace BlaBla.DataImportSample
{
public enum EFields
{
Name,
Vorname,
Email,
Fx,
Fy,
// usw.
}

public enum EPolicies
{
Default,
VerfahrenX,
VerfahrenY,
// usw.
}

[System.Flags]
public enum EBlocks
{
None = 0,
Kopf = 1,
Teilnehmer = 2,
Leistungen = 4,
// usw.
}

public class DataImport : FixLenghtDs
{
public DataImport()
{
InitFields();
InitPolicies();
}

private void InitFields()
{
this.m_Fields = new
List<DsField>(Enum.GetValues(typeof(EFields)).Length);

EBlocks blocks = EBlocks.Kopf;
this.m_Fields.Add(new DsField(EFields.Name, blocks, 20, 1));
this.m_Fields.Add(new DsField(EFields.Vorname, blocks, 20, 1));
this.m_Fields.Add(new DsField(EFields.Email, blocks, 20, 1));

blocks = EBlocks.Teilnehmer | EBlocks.Leistungen;
this.m_Fields.Add(new DsField(EFields.Fx, blocks, 594, 18));
this.m_Fields.Add(new DsField(EFields.Fy, blocks, 1796, 18));
}

private void InitPolicies()
{
this.m_Policies = new List<DsPolicy>(3);

EBlocks blocks = EBlocks.Kopf |
EBlocks.Teilnehmer |
EBlocks.Leistungen;

this.m_Policies.Add(new DsPolicy(EPolicies.Default, blocks));


blocks = EBlocks.Kopf |
EBlocks.Leistungen;

this.m_Policies.Add(new DsPolicy(EPolicies.VerfahrenX, blocks));


blocks = EBlocks.Kopf |
EBlocks.Teilnehmer;

this.m_Policies.Add(new DsPolicy(EPolicies.VerfahrenY, blocks));
}

// ...
}
}
<\code>

Nun klappt es aber nicht, die geerbte Methoden der Basisklassen kennen die
"neuen" Kodierungswerte nicht.
Ist eine Sackgasse?

Ciao:
GG ;-)
 

Lesen sie die antworten

#1 Herfried K. Wagner [MVP]
28/08/2007 - 18:25 | Warnen spam
"Georg Gungl" schrieb:
[Erweitern von Aufzàhlungstypen, die in der Basisklasse definiert wurden]



Das ist nicht möglich. Aufzàhlungstypen sind Typen und ein Aufzàhlungstyp
kann nicht vom anderen erben.

M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Ähnliche fragen