2012-02-24 51 views
1

我有兩個抽象類Business & Person。問題是我有一個可以是商業或個人的客戶類型。有沒有辦法對此進行建模,以便我沒有CustomerBusiness和CustomerPerson類?多重繼承不是一個選項,因爲這是C#。我一直在看這個這麼長時間,我看不到樹林。試圖避免類結構中的多個子類型

public abstract class Business { 
    public string Name { get; set; } 
} 

public abstract class Person { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string MiddleName { get; set; } 
    public DateTime? BirthDate { get; set; } 
    public string Comments { get; set; } 
} 

public class CustomerBusiness : Business, CustomerRoles { 
    public bool BillTo { get; set; } 
    public bool ShipTo { get; set; } 
    public bool DeliverTo { get; set; } 
    public EntityType Type { get; set; } 
} 

public class CustomerPerson : Person, CustomerRoles { 
    public bool BillTo { get; set; } 
    public bool ShipTo { get; set; } 
    public bool DeliverTo { get; set; } 
    public EntityType Type { get; set; } 
} 

public interface CustomerRoles { 
    bool BillTo { get; set; } 
    bool ShipTo { get; set; } 
    bool DeliverTo { get; set; } 
} 

回答

2

你可以prefer composition over inheritance具有BusinessPerson班「有」 ICustomerRoles而不是「是」 ICustomerRoles

public class Business 
{ 
    public string Name { get; set; } 

    public ICustomerRoles CustomerRoles { get; set; } 
} 

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string MiddleName { get; set; } 
    public DateTime? BirthDate { get; set; } 
    public string Comments { get; set; } 

    public ICustomerRoles CustomerRoles { get; set; } 
} 
+0

謝謝埃德,我開始看到你的觀點。我需要澄清的是,我認爲我需要保持業務和人員類的抽象,因爲將有其他類將始終具有業務和人員屬性集。例如:供應商,部門,部門等... – Chris 2012-02-27 15:27:48

+0

我不確定我能否使用這個方法,因爲在這個項目中有其他限制(不是我原來的問題),但這個解決方案是最好的答案到目前爲止已經找到了。謝謝,埃德。 – Chris 2012-02-28 13:04:57

1

我會說,你有你的heirarchy在錯誤的順序。客戶應該是一個基類,然後Business和Person應該是Customer類的實現。我確信除了CustomerRoles界面中的客戶以外,所有類型的客戶都有一個共同的客戶屬性。

我原以爲會有像CustomerCode等東西。你也可以說,所有的客戶都有一個名稱屬性,這取決於每個子類中的getter返回適當的值。正如在一個企業將有一個名爲Name的單一屬性,而一個人將有每個FirstName,MiddleName,Surname和一個Name屬性,以某種方式連接這些屬性。

+0

Tobsey,我想你的方法,但我遇到了麻煩,當我需要繼承業務屬性合併到另一個實體很像客戶。你有一個示例實現,你可以告訴我嗎?也許我沒有妥善解釋你的答案。 – Chris 2012-02-27 15:29:28