2013-11-28 152 views
0

我想了解更多關於類設計的知識,並遇到了一個困境。假設我有三個抽象的在線拍賣:出售,賣方和買方。 A賣方賣方和買方。賣方和買方有類似的字段集合,例如姓名,電話號碼和地址,並且將它們分組爲單個類別是有意義的,例如Person。然後,我們可以集中代碼,爲抽象人類中的字段和訪問者集中代碼,併爲教師和學生提供特定的類型。抽象方法vs繼承

這可能會導致代碼,如:

class Sale { 
    Person teacher; 
    Person student; 

    String description; 
    int hourlyRate; 

    // Some lesson methods 
} 

abstract class Person { 
    private String name; 
    private String address; 
    private String telephoneNumber; 
    // Getters & setters... 
} 

class Seller extends Person { 
    // Some teacher stuff 
} 

class Buyer extends Person { 
    // Some student stuff 
} 

現在,應用需求納入企業對企業客戶,但由於賣方和買方的類型的人,他們沒有融入我們的類層次結構。如果我們使用一個接口,這可能會被阻止,但我們需要複製不同的聯繫人字段。

這種情況最好的辦法是什麼?

+1

通過組合而不是繼承考慮擴展。在此過程中,您可以同時使用抽象類和接口,其中賣方和買方包含由接口定義的某種代理,並且您的人抽象類實現接口,並且抽象業務客戶端實現接口。 –

+0

@HovercraftFullOfEels你能提供一個例子嗎? – kiruwka

+0

要問的一個重要問題是,一個人可以是**賣方還是買方? –

回答

0

將人員重命名爲NaturalPerson,並從BusinessObject或其他任何可能符合您所在地區的名稱推導出來。然後你可以從那裏得到PersonBusiness

3

考慮通過組合擴展而不是繼承。在此過程中,您可以同時使用抽象類和接口,其中賣方和買方包含由接口定義的某種代理,並且您的人抽象類實現接口,並且抽象業務客戶端實現接口。

例如

// both buyer and seller 
class BusinessEntity { 
    // an interface that can be a person, or a business 
    private Agent agent; 

然後Person類...

abstract class Person implements Agent { 

} 

和公務艙

abstract class Business implements Agent { 

} 

,並考慮設置的東西,以便它會很容易使用依賴注入來更改您的BusinessEntity所持有的代理

1

考慮使用合成而不是繼承來處理您的聯繫人字段,這些字段不適合作爲業務的一部分,而是一種共享工具。例如:

class Identity { 
    private String name; 
    private String address; 
    private String telephoneNumber; 
    // Getters & setters... 

    // behaviours 
} 

class Seller { 
    private Identity identity; 
    // Getters & Setters 

    // behaviours 
} 

class Buyer { 
    private Identity identity; 
    // Getters & Setters 

    // behaviours 
} 

因此,你可以通過買方和賣方類共享聯繫人身份信息相關的行爲,同時保持你的類型,層次結構,以真正顯著業務相關的功能