2012-02-24 2 views
1

2つの抽象クラスがあります。ビジネス&人。問題は、私がビジネスか人かのどちらかになることができる顧客タイプがあることです。私は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 inheritanceBusinessPersonクラスを持つことができ代わりに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

+0

このプロジェクトでは、他の制約(私の元の質問ではない)のためにこのメソッドを使用できるかどうかはわかりませんが、この解決策はベストですこれまでのところ見つかった。ありがとう、エド。 – Chris

1

あなたの間違った順序であなたの階層があると言います。顧客は基本クラスでなければならず、次にBusinessとPersonはCustomerクラスの実装でなければなりません。私は、CustomerRolesインターフェース以外のすべてのタイプのCustomerに共通する、より多くのCustomer属性があることを確信しています。

CustomerCodeなどがあると思っていました。また、すべての顧客にNameプロパティがあり、適切な値を返すのは各サブクラスのgetterまでです。ビジネスではNameと呼ばれる単一のプロパティがありますが、PersonはFirstName、MiddleName、Surname、およびこれらを連結するNameプロパティをそれぞれ持っています。

+0

私はあなたのアプローチを試みましたが、ビジネスプロパティを顧客とよく似た別のエンティティに継承する必要があるときに遭遇しました。私に見せてもらえる実装の例はありますか?たぶん私はあなたの答えを正しく解釈していないでしょう。 – Chris

関連する問題