2010-09-16 28 views
1

我有一個名爲IProjectUser的接口,它定義了讀取和寫入項目文件的讀取函數和寫入函數。我也有一個名爲Project的類,它包含一個IProjectUser對象的通用列表來管理項目文件。這兩個都在類庫Project.dll中。類庫中的可選接口

我也有叫A.DLL一個類庫,它包含一個名爲Foo類,它實現IProjectUser。讀取/寫入項目文件的能力次於此類。它擁有並操縱一些數據。 A.dll引用Project.dll。

該應用程序還包含實現IProjectUser某些形式和其他類。

我能想象在未來,我可能要在另一個項目中不使用項目文件使用A.DLL的情況。但是,我會被迫僅僅因爲A.dll需要包含Project.dll。即使功能是可選的。

是否有不同的設計模式,讓我基本上做一個接口可選?

我希望我解釋這顯然不夠。

更新

約鑄造對象的接口是什麼?這會打開接口未正確實現的可能性。對於這類問題,這是一種好還是壞的設計方法?

if (Foo is IProjectUser) { 
    ProjectUsers.Add(Foo as IProjectUser); 
    // etc 
} 
+0

你爲什麼不把這個A.dll分割成單個責任的多少個類? – 2010-09-16 22:52:20

+0

Foo擁有和操縱數據。我希望可以選擇將此對象的狀態保存/加載到項目文件中。我將如何分割?我已經分離出了保存和加載到Project.dll的代碼。 – Andy 2010-09-16 22:58:17

回答

2

使用繼承的或多個接口。您無法使接口方法爲可選。

+0

我知道。那麼還有什麼其他的設計可以運作? – Andy 2010-09-16 22:59:42

1

鑄造你的對象,它沒有實現將無法工作的界面 - 你會在你的變量空值結束。如下所示,使用適當的設計並添加B.dll有什麼問題? A.dll變得完全可重用,並且您仍然擁有實現IProjectUser的Foo版本。

  1. 從A.dll中刪除對Project.dll的引用。
  2. 從Foo中刪除IProjectUser。
  3. 創建引用Project.dll和A.dll的B.dll。
  4. 在繼承自Foo並實現IProjectUser的B.dll中創建FooProjectUser。
  5. 將項目特定的邏輯從Foo移到FooProjectUser中。
  6. 在您當前使用Foo的地方使用FooProjectUser,從任何對Project.dll的引用中釋放A.dll。