2011-01-11 14 views
0

Betrachten wir ich die folgende Hierarchie erstellen möchten:Hierarchisches Klassenentwurf

Animal -> Klasse (Säugetier, Amphibie, ...) -> Familie (Felidae, Canidae, ...) -> Species (cat , Tiger, ...).

jede Unterklasse ist abhängig von der vorherigen.

Irgendwelche Vorschläge für die beste Methode zum Erstellen einer baumähnlichen Klasse ähnlich dieser? Diese

ist nur ein Beispiel für das Problem, das ich an den Händen haben, aber eine Lösung würde mir sehr helfen ...

dank

Das eigentliche Problem ist folgendes:

Ich habe zu analysieren eine Nachricht vom folgenden Typ 0102060800FF.

Zuerst sagt 01 mir, dass ich eine bestimmte Art von Nachricht habe. Bei diesem Typ muss ich in einer bestimmten Tabelle nach dem Wert 02 suchen und so weiter ...

Ich möchte die möglichen Werte einer Unterhierarchie durch das übergeordnete Element gefiltert werden. Ich bin mir nicht sicher, ob ich klar genug bin.

dank

+1

Ein konkreteres Beispiel könnte helfen. – svrist

+0

In Ihrer Frage haben Sie gerade definiert, was der Zweck der objektorientierten Programmierung sowie Vererbung ist. Von deiner Frage bin ich verwirrt, was du versuchst zu tun. Versuchen Sie, eine Klasse zu erstellen, um ein solches Diagramm visuell darzustellen? Oder sprechen Sie über die Struktur der Datenobjekte in Ihrem Programm? –

+0

Ich spreche über Datenstruktur. Angesichts des realen Beispiels möchte ich eine Hierarchie von Klassentypen erstellen. Wenn ich die Basiskalibrierung als Typ1 definieren würde, wären die folgenden Möglichkeiten auf einen bestimmten Bereich von Typen – tekknoplast

Antwort

1

In diesen Tagen bevorzugen Zusammensetzung über Vererbung. Hier ist ein Beispiel - benötigt einige weitere Logikprüfung, um sicherzustellen, dass Sie in die richtige Hierarchie usw. hinzufügen.

public class Class 
{ 
    private readonly IList<Animal> animals = new List<Animal>(); 

    public IEnumerable<Animal> Animals 
    { 
     get 
     { 
      return this.animals; 
     } 
    } 

    public void AddAnimal(Animal animal) 
    { 
     if (animal == null) 
     { 
      throw new ArgumentNullException("animal"); 
     } 

     this.animals.Add(animal); 
    } 

    //// etc. 
} 

public class Family 
{ 
    private readonly IList<Animal> animals = new List<Animal>(); 

    public IEnumerable<Animal> Animals 
    { 
     get 
     { 
      return this.animals; 
     } 
    } 

    public void AddAnimal(Animal animal) 
    { 
     if (animal == null) 
     { 
      throw new ArgumentNullException("animal"); 
     } 

     this.animals.Add(animal); 
    } 

    //// etc. 
} 

public class Species 
{ 
    private readonly IList<Animal> animals = new List<Animal>(); 

    public IEnumerable<Animal> Animals 
    { 
     get 
     { 
      return this.animals; 
     } 
    } 

    public void AddAnimal(Animal animal) 
    { 
     if (animal == null) 
     { 
      throw new ArgumentNullException("animal"); 
     } 

     this.animals.Add(animal); 
    } 

    //// etc. 
} 

public class Animal 
{ 
    private readonly Class @class; 
    private readonly Family family; 
    private readonly Species species; 

    public Animal(Class @class, Family family, Species species) 
    { 
     if (@class == null) 
     { 
      throw new ArgumentNullException("@class"); 
     } 

     if (family == null) 
     { 
      throw new ArgumentNullException("family"); 
     } 

     if (species == null) 
     { 
      throw new ArgumentNullException("species"); 
     } 

     [email protected] = @class; 
     this.family = family; 
     this.species = species; 
     [email protected](this); 
     this.family.AddAnimal(this); 
     this.species.AddAnimal(this); 
    } 

    public Class Class 
    { 
     get 
     { 
      return [email protected]; 
     } 
    } 


    public Family Family 
    { 
     get 
     { 
      return this.family; 
     } 
    } 


    public Species Species 
    { 
     get 
     { 
      return this.species; 
     } 
    } 
} 
1

Jede Klasse des eigentlichen Tier nach unten ist eine abstrakte Klasse. Tiger ist eine konkrete Klasse, die von der abstrakten Klasse Felidae, von der abstrakten Klasse Mammalia, usw. erbt.

Wenn Sie wirklich schick werden wollen, können Sie Schnittstellen verwenden, wie IPredator, IWarmBlooded; Definieren Sie sie als Fähigkeiten.

+0

beschränkt. Nur weil Sie CAN bedeutet nicht, dass Sie SOLLEN. Wenn es keinen konkreten Grund gibt, Interfaces zu definieren (Sie müssen zum Beispiel Fressfeinde anders behandeln als andere), sollten Sie nicht für jede mögliche Klassifizierung eine Klasse oder Schnittstelle erstellen. – Mark

+0

Sicher, aber das ist für ihn zu entscheiden. Er fragte "wie", nicht "warum". –

+0

Nachdem er sich sein Update angeschaut hat, sieht es eher so aus, als ob er statt einer Objekthierarchie einen LINQ-Provider schreiben sollte. –

Verwandte Themen