2015-09-24 2 views
0

У меня есть класскласса со многим наследуемым классом с одним общим списком

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; } 
    } 

Как я могу это сделать?

+0

'List ' будет делать. – haim770

+0

@ haim770 это не будет. например, если у меня есть унаследованный класс из BaseHeaderFooterItem, с именем TvGuid и хочу, чтобы потомки удерживали класс TvGuid, я не буду работать –

+0

@AdamB, он должен. Почему бы и нет? –

ответ

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; } 
} 

И вы можете добавить любой TPE, который наследуется от BaseHeaderFooterItem, для образца:

var list = new List<BaseHeaderFooterItem>(); 

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

Или, если вам нужен тип specif для каждого BaseHeaderFooterItem, чем пытаться specif родовое по декларации.

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 */} 
           } 
    }); 
+0

Возможно, с 'where T: BaseHeaderFooterItem ' ограничение? – juharr

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 и иметь все эти свойства.

Смежные вопросы