2012-10-15 46 views
3

我需要在我的實體中爲組織層次結構建模。一個組織可以是總部,區域負責人,分區域,區域辦事處。組織正在執行許多常用功能,但有幾種功能僅限於區域可以執行任務A.還有一些屬性(數據)是特定於區域的。組合與繼承。我哪裏做錯了?

我使用組合而不是繼承對其進行建模,但是現在我只結束了一個組織類,其中很多引用取決於組織類型可以具有有效引用或爲空。

對象組合是一種痛苦,現在我正在通過工廠來處理。但是現在我主要關心的是開發人員需要記住組織類型是什麼以及某個屬性是否對該組織有某種意義。

只是爲了清楚我的意思。

public class Organization : IKeyed<int> { 
     public virtual int Id { get; protected set; } 
     public virtual string Code { get; set; } 
     public virtual OrganizationType orgType {get;set;} 
     public virtual Organization Parent {get;set;} 
     public virtual IList<Organization> Children {get;set;} 

     public virtual typeA {get; set;} // only meaningful when organization type is 'Head office' 

     public virtual typeB {get;set;}// only meaningful when 'Region' 
     public virtual void AddChild(Organization org){...} 
    ... 

    } 

我應該在這裏使用繼承嗎?或者我在這裏錯過了一些技巧?

+0

也許它可能更舒適和方便的有一個層次結構,並沒有TypeA/TypeB作爲基類屬性。我沒有看到這裏的組成..任何組織可以包含其他組織?即使如此,仍然可能在相關類中使用TypeA和TypeB將更容易使用 – YavgenyP

+0

爲簡潔起見,我已經簡化了很多,忘記提及事實,即每個組織都有一個對Parent及其子組織的參考。 –

+0

@YavgenyP TypeA和typeB引用的屬性僅在組織的類型稱爲Headoffice時有用。將會有很多其他引用僅在類型爲Region Region等時有效......等等 –

回答

6

在我看來,我建議你創建一個抽象的基類,它擁有共同的行爲和領域。然後,您可以添加子類來擴展更具體的行爲和/或屬性。

public abstract class Organization : IKeyed<int> { 
    public virtual int Id { get; protected set; } 
    public virtual string Code { get; set; } 

    // remove this property 
    // public virtual OrganizationType orgType {get;set;} 
    public virtual Organization Parent {get;set;} 
    public virtual IList<Organization> Children {get;set;} 

    // move this property to sub-class 
    // public virtual typeA {get; set;} // only meaningful when organization type is 'Head office' 

    // move this property to sub-class 
    // public virtual typeB {get;set;}// only meaningful when 'Region' 

    public virtual void AddChild(Organization org){...} 
    ... 

} 

public class HeadOffice : Organization 
{ 
    public virtual typeA { get; set; } 
} 

public class Region : Organization 
{ 
    public virtual typeB { get; set;} 
} 

public class OtherOrganizationType : Organization 
{ 
    // 
} 
1

在問候您的具體問題與遺傳組成:格言我聽說過一遍又一遍的是「使用繼承時,對象A是一類對象B.用的組合物時,由對象的對象B「。

在這種情況下,您不能說區域辦事處是一種總部辦公室。你也不能說總公司是由區域辦事處組成的。這告訴我這些物體不應該直接相關。相反,想一想每個人是如何使他們適合執行常見任務的。也許他們都可以HireWorker,因爲他們都是HiringOrganizations,也許他們都可以ReportSales,因爲他們都是SalesEntities。在這些情況下,您應該有一個HiringOrginization或SalesEntity超類,其中HeadOffice和RegionalOffice都是子類。

就org結構而言,可能值得考慮在獨立的OrgStructure對象中維護該結構。 OrgStructure對象不是在每個對象中都有一個Parent屬性和一個Child屬性,而是維護所有對象實例之間的關係。這提供了更多的靈活性,並消除了將關係維護到專用對象的責任。