2009-09-16 87 views
0

我試圖實現一個IDescription接口。這個接口的基本目的是我有許多不同的類,它們有多種語言的描述列表,我希望基本的AddDescription EditDescription和其他一些基本行爲由接口定義,而不是由繼承接口的類實現。我正試圖使用​​擴展方法將行爲分配給接口。使用泛型和擴展方法的IDescription接口

我有一些路障,如我如何訪問我傳遞到IDescription接口(entity.Descriptions.Add)的實體的描述集合?

我是非常新的泛型,擴展方法,匿名類型等,請容忍我與我如何使用這些誤解。如果你能幫助我糾正下面的代碼,將不勝感激。我寫這篇文章是爲了說明我正在努力達到的目標,它顯然是基本的錯誤。由於

public class Company : IDescription<Company, CompanyDescription> 
{ 
    public IList<CompanyDescription> Desriptions { get; set; } 
} 

public class Location : IDescription<Location, LocationDescription> 
{ 
    public IList<LocationDescription> Desriptions { get; set; } 
} 


public interface IDescription<eT, dT> 
{ 
    void AddDescription(eT, string text); 
    void EditDescription(eT, dT, string text); 
} 

public static DescriptionInterfaceExtensions 
{ 

    public static void AddDescription(this IDescription<eT, dT> description, eT entity, string text) 
    { 
     dT newDescription = new dT(text); 
     entity.Descriptions.Add(newDescription); 
    } 
} 

回答

1

另一種可能重寫,應該工作是刪除添加/編輯方法從接口,並提供所需的IList在接口。然後,爲了便於使用,您可以使用擴展方法使其更容易。

我不是說這個例子是一個偉大的使用泛型和擴展方法,但它會工作:

public class CompanyDescription : IDescription { public string Text { get; set; } } 
public class LocationDescription : IDescription { public string Text { get; set; } } 

public class Company : IHaveDescriptions<CompanyDescription> 
{ 
    public IList<CompanyDescription> Desriptions { get; set; } 
} 

public class Location : IHaveDescriptions<LocationDescription> 
{ 
    public IList<LocationDescription> Desriptions { get; set; } 
} 

public interface IDescription 
{ 
    string Text { get; set; } 
} 
public interface IHaveDescriptions<T> 
    where T : class, IDescription, new() 
{ 
    IList<T> Desriptions { get; set; } 
} 

public static class DescriptionInterfaceExtensions 
{ 
    public static void AddDescription<T>(this IHaveDescriptions<T> entity, string text) 
     where T : class, IDescription, new() 
    { 
     T newDescription = new T(); 
     newDescription.Text = text; 
     entity.Desriptions.Add(newDescription); 
    } 
    public static void EditDescription<T>(this IHaveDescriptions<T> entity, T original, string text) 
     where T : class, IDescription, new() 
    { 
     T newDescription = new T(); 
     newDescription.Text = text; 
     entity.Desriptions.Remove(original); 
     entity.Desriptions.Add(newDescription); 
    } 
} 
+0

這正是我要的,感謝您的時間 – kaivalya 2009-09-16 19:50:05

+0

有一個問題,我我跑到這裏: 我有LocationDescription和CompanyDescription分開的原因是因爲我有每個這些類的屬性,將它們連接到父級,例如:CompanyDescription類具有公司類型的公司屬性和LocationDescription具有位置類型的位置屬性。我怎樣才能將這些屬性包含到這種方法中。我需要設置這些屬性,但由於我們正在使用IDescription,所以我無法訪問它們。 我有單獨的具體子類實現,因爲我使用nhibernate作爲我的ORM。我認爲 – kaivalya 2009-09-17 15:52:57

+0

IDescription也是通用的,但我認爲這不適用於nhibernate映射... – kaivalya 2009-09-17 15:53:47

0

不能添加接口實現使用擴展方法的類,雖然這似乎是你正在嘗試做的。

擴展方法的目的是將行爲添加到現有類型(類或接口)。

您的代碼存在的問題是您聲明Company和Location應該實現IDescription接口;但他們沒有。他們沒有AddDescription或EditDescription方法,所以這不起作用。

爲什麼不定義一個具體的通用描述類並將該類附加到公司和位置?

1

我的例子看起來合同是具有描述的對象存儲描述列表。因此,要避免在類直接申報添加和刪除方法,你可以做這樣的事情:

接口

public interface IDescription<T> 
{ 
} 

public interface IHasDescription<THasDescription, TDescription> 
    where THasDescription : IHasDescription<THasDescription, TDescription> 
    where TDescription : IDescription<THasDescription> 
{ 
    IList<TDescription> Descriptions { get; } 
} 

具體實現

public class CompanyDescription : IDescription<Company> 
{ 
} 

public class Company : IHasDescription<Company, CompanyDescription> 
{ 
    private readonly IList<CompanyDescription> descriptions; 

    public IList<CompanyDescription> Descriptions 
    { 
     get { return this.descriptions; } 
    } 
} 

擴展方法

public static class DescriptionExtensions 
{ 
    public static void AddDescription<THasDescription, TDescription>(
      this THasDescription subject, 
      TDescription description) 
     where THasDescription : IHasDescription<THasDescription, TDescription> 
     where TDescription : IDescription<THasDescription> 
    { 
     subject.Descriptions.Add(description); 
    } 
} 

但我不認爲這是值得這樣做只是爲了有

mycompany.AddDescription(mydescription); 

,而不是

mycompany.Descriptions.Add(mydescription);