我是自動化倉庫,我正在嘗試爲下一個任務創建域模型:如何分離具有接口的抽象級別?
倉庫有很多產品。產品可以是液體或雜貨,也可以是一件一件。倉庫中有兩條包裝線可以包裝液體產品或所有其他產品。逐件產品不需要包裝。
這裏是我的模型:
enum ProductType
{
Liquid,
Grossery
}
interface IProduct
{
ProductType ProductType { get; }
}
interface IPackedProduct : IProduct
{
bool IsPacked { get; }
}
interface ILiquidProduct : IProduct
{
}
interface IGrosseryProduct : IProduct
{
}
interface IPackingLine
{
IPackedProduct Pack(IProduct product);
}
interface IGrosseryPackingLine : IPackingLine
{
IPackedProduct Pack(IGrosseryProduct p);
}
class ProductPackingLine : IPackingLine
{
public IPackedProduct Pack(IProduct product)
{
Console.WriteLine("Packing {0} default packing line", product);
return new PackedProduct(product);
}
}
class LiquidsPackingLine : IPackingLine
{
public IPackedProduct Pack(ILiquidProduct product) // I want this <=======================
{
Console.WriteLine("Packing {0} by liquid packing line", product);
return new PackedProduct(product);
}
}
class GrosseryPackingLine : IPackingLine
{
public IPackedProduct Pack(IProduct product)
{
Console.WriteLine("Packing {0} by grossery packing line", product);
return new PackedProduct(product);
}
}
我使用的是這樣的:
IProduct milk = new LiquidProduct(ProductType.Liquid);
IProduct pasta = new GrosseryProduct(ProductType.Grossery);
var packer = new PackingManager();
IPackedProduct packedMilk = packer.Pack(milk);
IPackedProduct packedPasta = packer.Pack(pasta);
這裏是PackingManager
class PackingManager
{
public IPackedProduct Pack(IProduct product)
{
IPackingLine pl = GetPackingLineByProduct(product);
return pl.Pack(product);
}
private IPackingLine GetPackingLineByProduct(IProduct product)
{
switch (product.ProductType)
{
case ProductType.Liquid:
return new LiquidsPackingLine();
case ProductType.Grossery:
return new GrosseryPackingLine();
default:
throw new InvalidOperationException();
}
}
}
的問題是,如果我會使用IPackingLine.Pack(IProduct p)
我可以錯誤地將ILiquidProduct
的對象傳遞給錯誤的包裝行。但我需要我所有的包裝線實施IPackingLine
才能夠以更常見的方式使用它們。
如何避免這種情況?
看來您需要使用泛型,因此您可以限定給定打包程序可打包的各種東西。猜測語言,參見例如https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/introduction-to-generics – jonrsharpe
您的'PackingManager'打破了打開關閉原則。爲什麼你需要一個通用的/通用的'PackingManager'? –
我需要某個人來決定使用哪一個包裝線。在其他情況下,邏輯將分散在整個應用程序中。關於'GetPackingLineByProduct' - 這只是爲了簡單起見。在真正的應用程序中,我會注入一個工廠,它將建立我'IPackingLine' –