我想確定構建一些代碼的最佳方法。我承認這可能是過度的,正在變成比實際更具學術性的東西。有時你無法自拔。有沒有一種在C#中實現此模板方法或策略類模式的優雅方法?
讓我圖謀一個簡單的例子:
假設你的類/接口,如:
interface IProcessedPhoto { }
interface IPhotoProcessor
{
IProcessedPhoto Process(byte[] bytes);
void Alter(IProcessedPhoto processedPhoto);
}
class PhotoProcessedWithAMethod : IProcessedPhoto { }
class PhotoProcessedWithBMethod : IProcessedPhoto { }
class AProcessor : IPhotoProcessor
{
IProcessedPhoto Process(byte[] bytes); // Returns PhotoProcessedWithAMethod
void Alter(IProcessedPhoto processedPhoto)
{
var casted = processedPhoto as PhotoProcessedWithAMethod;
// a "B" would crash here.
}
}
class BProcessor : IPhotoProcessor
{
IProcessedPhoto Process(byte[] bytes); // Returns PhotoProcessedWithBMethod
void Alter(IProcessedPhoto processedPhoto)
{
var casted = processedPhoto as PhotoProcessedWithBMethod;
// an "A" would crash here.
}
}
class Algorithm
{
void DoStuff()
{
var processor = ProcessorFactory.CreateProcessor(//stuff);
var processedPhoto = processor.ProcessPhoto(new byte[100]);
processor.Alter(processedPhoto);
}
}
所以基本上我想要的DoStuff()方法來創建一種圖像處理器,和呼叫適當的Process方法。但是,儘管接口所暗示的是,進程只適用於相應類型的IProcessedPhoto(A和B照片不可互換,它們只是具有類似的方法名稱)。我的真實代碼比較複雜,因爲每個處理器都有幾個特定於它們的類,而且不可互換,但我想執行一組「邏輯」操作,如模板方法。
var artifactA = processor.DoA();
var artifactB = processor.DoB();
var final = processor.Process(artifactA, artifactB);
我希望能解釋一下。
謝謝,我正在嘗試此路徑。我不喜歡它的一件事(你指出我認爲)是由CreateProcessor返回的對象除了對象之外沒有共同的祖先。我無法編寫與As或Bs一起工作的代碼(但不能同時使用這兩種代碼),而無需投入更通用的代碼,在這種情況下,我又回到了開始的地方。 – Jeremy 2011-05-31 18:13:15
您可以從工廠返回一個'IPhotoProcessor'。但工廠方法本身需要該類型參數;這迫使客戶知道哪個值用於類型參數。更好的方法是將整個交互封裝在另一個對象中,並且客戶端不需要擔心來自'Process'方法的返回值。 –
2011-05-31 18:31:38