2011-01-11 94 views
0

让我们考虑一下,我想创建以下层次:分层级设计

动物 - >类(哺乳动物,两栖动物,...) - >家庭(猫科,犬科,...) - >种(猫,老虎,...)。

每个子类都依赖于前一个子类。

任何有关创建类似树的类的最佳方法的建议?

这只是我在手,但解决方案将帮助我很多问题的一个例子...

感谢

真正的问题是这样的:

我要解析一个以下类型的消息0102060800FF。

首先,01告诉我我有一个特定类型的消息。 鉴于这种类型,我必须在特定的表中查找值02,依此类推......

我想要一个由其父项过滤的子层次结构的可能值。我不确定我是否足够清楚。

感谢

+1

更具体的示例可能有所帮助。 – svrist 2011-01-11 17:08:02

+0

在你的问题中,你只是定义了面向对象编程的目的以及继承。从你的问题我很困惑,你想做什么。你是否试图想出一个类来直观地显示这样的图表?还是你在谈论你的程序中的数据对象的结构? – 2011-01-11 17:10:01

回答

1

这些天,赞成构成比继承。这里有一个例子 - 需要更多的逻辑检查,以确保您添加到正确的层次结构中,等等。

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

每节课下来实际的动物是一个抽象类。 Tiger是一个具体的类,它继承了抽象类Felidae,抽象类Mammalia等。

如果你想获得真正的喜欢,你可以使用接口,如IPredator,IWarmBlooded;将它们定义为功能。