2012-08-30 18 views
3

我需要構建一個使用方法鏈接的類。我理解方法鏈的概念。例如:Fluent接口(方法鏈接)向後導航

class Company 
{ 
    private String companyName; 
    public setCompanyName(String companyName) 
    { 
     this.companyName = companyName; 
     return this; 
    } 

    public Person addPerson(String name) 
    { 
     person = new Person(); 
     person.setName(name); 

     return person; 
    } 
} 

class Person 
{ 
    private String name; 
    private String address; 
    private bool license 

    public Person setName(String name) 
    { 
     this.name = name; 
     return this; 
    } 

    public Person hasDriverLicense(bool license) 
    { 
     this.license = license; 
     return this; 
    } 

    public Person setAddress(String address) 
    { 
     this.address = address; 
     return this; 
    } 
} 

//in some other class/method i do: 
Company company = new Company() 
.setCompanyName("SomeCompany") 
.addPerson("Mike") 
.setAddress("Street 118"); 

但我需要更進一步。我需要能夠做到這一點:

Company company = new Company() 
.setCompanyName("SomeCompany") 
.addPerson("Mike") 
.setAddress("Street 118"); 
.addPerson("Jane") 
.setAddress("Street 342"); 
.hasDriverLicense(true) 

所以,你可以看到我需要能夠繼續鏈接。方法addAddress並不總是鏈中的最後一個方法。它可以是Person類中的任何方法。

有沒有一種很好的方法來實現這個功能?也許有方法擴展或什麼的?

任何幫助/示例非常感謝。

+5

我必須問... *爲什麼*你想這一切都是一個連續嚴重的方法?難道你不能只存儲公司並從那幾次調用addPerson? 'var company = ...; company.addPerson(...)setAddress(...)。 company.addPerson(...)。setAddress(...);'? –

+2

甚至更​​好...只是對象/集合初始值設定項? var company = new Company {Name =「SomeCompany」,People = {new Person {Name = Mike「,Address =」Street 118「},new Person {Name =」Jane「,Address =」Street 342「,HasDriverLicence = (在IDE中它看起來更漂亮,而不是全部壓縮成一個註釋!) –

+0

來自我的+1對於出軌;-) – Vitaliy

回答

3

可以做到這一點。哪個並不意味着你應該

個人和公司的方法應該簡單地返回一個對象,在上下文中聚合人和公司。如果您有IPerson接口和ICompany接口,則此類型將同時實施這兩種接口,並在內部保持引用並適當地分派呼叫。 (呼叫IPerson方法將委派給內部IPerson)。

這就是說,我會強烈勸阻你不要走這條路。它很混亂,很難調試並違反基本的OO原則(例如接口隔離)。

+2

謝謝,因爲你和我得到的評論我現在確定我應該採取不同的方法。 – w00