具有许多继承类的类,具有一个通用列表

时间:2015-09-24 11:47:45

标签: c# generics inheritance

我有一个班级

public class BaseHeaderFooterItem
{
  public string Title { get; set; }
  public string EnTitle { get; set; }
  public HyperLink Link { get; set; }
  public int Level { get; set; }
  public HyperLink MobileLink { get; set; }
}

许多其他阶级继承他 我想在BaseHeaderFooterItem类中使用泛型列表 这将能够保存任何类型的继承类的列表。 像这样的东西:

public class BaseHeaderFooterItem
    {
      public string Title { get; set; }
      public string EnTitle { get; set; }
      public HyperLink Link { get; set; }
      public int Level { get; set; }
      public HyperLink MobileLink { get; set; }
      public List<T> Descendants { get; set; }
    }

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以尝试保留属性以保存基类型的子集合。

public class BaseHeaderFooterItem
{
  public string Title { get; set; }
  public string EnTitle { get; set; }
  public HyperLink Link { get; set; }
  public int Level { get; set; }
  public HyperLink MobileLink { get; set; }

  // here you can add instances of BaseHeaderFooterItem and any inherits type
  public List<BaseHeaderFooterItem> Descendants { get; set; } 
}

您可以添加任何继承自BaseHeaderFooterItem的tpe,用于示例:

var list = new List<BaseHeaderFooterItem>();

list.Add(new BaseHeaderFooterItem() {
        Title = "Test"
        Descendants = new List<BaseHeaderFooterItem>()
                                 {
                                    new ChildHeaderFooterItem() { /* properties */}
                                 }
    });

或者,如果您需要为每个BaseHeaderFooterItem指定一个特定类型,那么请尝试在声明中指定泛型。

public class BaseHeaderFooterItem<T>
             where T : BaseHeaderFooterItem<T>
{
  public string Title { get; set; }
  public string EnTitle { get; set; }
  public HyperLink Link { get; set; }
  public int Level { get; set; }
  public HyperLink MobileLink { get; set; }

  // only T types
  public List<T> Descendants { get; set; }
}

var list = new List<BaseHeaderFooterItem<ChildType>>();

list.Add(new BaseHeaderFooterItem() {
        Title = "Test"
        Descendants = new List<ChildType>()
                                 {
                                    new ChildHeaderFooterItem() { /* properties */}
                                 }
    });

答案 1 :(得分:0)

您可以使用此模式

public interface IBaseHeaderFooterItem
{
    string Title { get; set; }
    string EnTitle { get; set; }
    public HyperLink Link { get; set; }
    int Level { get; set; }
    HyperLink MobileLink { get; set; }
}

public abstract class BaseHeaderFooterItem<T> : IBaseHeaderFooterItem 
                                                where T : IBaseHeaderFooterItem
{
    public List<T> Descendants { get; set; }

     public abstract string Title { get; set; }
     public abstract string EnTitle { get; set; }
     public abstract HyperLink Link { get; set; }
     public abstract int Level { get; set; }
     public abstract HyperLink MobileLink { get; set; }
}

然后你可以从BaseHeaderFooterItem<T>继承而且T是约束,是一个实现IBaseHeaderFooterItem并拥有所有这些属性的类。