2013-09-25 73 views
1

IAM創建用於流利的接口有序構造,我已經寫了這個代碼:接口用於流利有序構造

public interface IMyObjectFactory: IObjectWithProperty 
{ 
    int objectId { get; set; } 
    IObjectWithProperty WithObjectId(int id); 
} 

public interface IObjectWithProperty 
{ 
    IObjectWithProperty WithObjectId(int id); 
    MyObject Create(); 
} 

第二接口是需要在構造方法來執行順序

的IMPL是這:

public class MyObjectFactory: IMyObjectFactory 
{ 
    public int objectId { get; set; } 
    private MyObjectFactory() { } 
    public static IObjectWithProperty BeginCreation() 
    { 
     return new ObjectFactory(); 
    } 
    public IObjectWithProperty WithObjectId(int id) 
    { 
     objectId = id; 
     return this; 
    } 

    public MyObject Create() 
    { 
     return new MyObject(this); 
    } 
} 

這是我的目標:

public class MyObject 
{ 
    public int Id { get; set; } 
    public MyObject(IMyObjectFactory factory) 
    { 
    this.Id = factory.objectId; 
    } 
} 

,所以我可以寫

MyObject mo = MyObjectFactory.BeginCreation().WithObjectId(1).Create(); 

但:

  • 我都在構造函數的接口並實現了一套界定財產,不喜歡太多
  • 靜態BeginCreation方法沒有接口
  • 我必須設置公開impl屬性,而我想它內部
  • 在接口我得到這個警告:Warning 7 'FunzIA.DL.Factory.Interfaces.IMyObjectFactory.WithObjectId(int)' hides inherited member 'FunzIA.DL.Factory.Interfaces.IObjectWithProperty.WithObjectId(int)'. Use the new keyword if hiding was intended.

但不是一個新的方法,我需要第二接口執行順序

任何建議?由於

+1

爲什麼很激動你需要'WithObjectId'中的同樣的方法?你通過繼承來獲得它。 – meilke

+0

排除此用途:MyObjectFactory。WithObjectId(1),它強制您必須先調用BeginCreation() –

回答

0

我做了這種方式:

  • 根本不想讓類的構造函數是可見的,我只希望工廠進行訪問


public interface IMyObjectFactory: IObjectWithProperty 
{ 
    int objectId { get; set; } 
} 

public interface IObjectWithProperty 
{ 
    IObjectWithProperty WithObjectId(int id); 
    MyObject Create(); 
} 

public class MyObjectFactory: IMyObjectFactory 
{ 
    public int objectId; 
    private MyObjectFactory() { } 

    public static IObjectWithProperty BeginCreation() 
    { 
    return new MyObjectFactory(); 
    } 

    public IObjectWithProperty WithObjectId(int id) 
    { 
    objectId = id; 
    return this; 
    } 

    public MyObject Create() 
    { 
    return new MyObject(this); 
    } 
} 

public class MyObject 
{ 
    public int Id { get; set; } 
    public MyObject(IMyObjectFactory factory) 
    { 
    this.Id = factory.objectId; 
    } 
} 
3
public class MyObjectFactory: IMyObjectFactory 
{ 
    private int objectId; 
    private MyObjectFactory() { } 

    public static IObjectWithProperty BeginCreation() 
    { 
    return new ObjectFactory(); 
    } 

    public IObjectWithProperty WithObjectId(int id) 
    { 
    objectId = id; 
    return this; 
    } 

    public MyObject Create() 
    { 
    return new MyObject(objectId); 
    } 
} 

public class MyObject 
{ 
    public int Id { get; set; } 
    public MyObject(int objectId) 
    { 
    this.Id = objectId; 
    } 
} 

我的看法:

  • 可以在IMyObjectFactory刪除WithObjectId。你通過繼承來獲得它。此設置是您獲得警告的原因。
  • BeginCreation很好。在某些時候,你必須創建真實世界的對象,這是不可能的,只有接口。你需要真正的課程。
  • 我絕不會讓MyObject知道任何工廠。工廠知道並創造物體,而不是相反。 Create應構建MyObject。這也導致不需要具有objectId屬性(您不喜歡它)。
+0

WithObjectId刪除:我從包含第二個接口的impl中提取接口並使一些混淆 –

+0

我不想讓其他類能夠創建對象沒有工廠,但我喜歡這個想法來調用對象構造函數:通過這種方式調用對象的人看到他必須使用工廠 –

+0

其他問題:是正確使用接口的構造函數還是更好地移動抽象工廠? –