一个类可以根据它在其中使用的上下文而表现不同吗?

时间:2016-11-16 23:28:15

标签: c# entity-framework oop

我的问题是我想在两个类中使用一个类,但是其中一个类中不存在属性。例如,仓库将物料运送到分支机构,分支机构中的物料应具有DiscountPercentage属性,但它不存在于仓库中。此外,两个类(WarehouseBranch)中的两个项目实例之间存在连接:当项目添加到分支时,应从仓库中的数量(属性)中减去数量。

我正在考虑OOP概念,它是如何帮助的,但我完全感到困惑。 我为Item创建了一个类:

public class Item
    {
        public Item()
        {
            this.Categories = new HashSet<Category>();
        }
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        [Required]
        public int Quantity { get; set; }
        [Required]
        public decimal Price { get; set; }
        [Range(0, 100), Display(Name = "Discount Percentage"), RegularExpression("([1-9][0-9]*)", ErrorMessage = "Enter only numeric number")]
        public double? DiscountPercentage { get; set; } = 0;
        public ICollection<Category> Categories { get; set; }
        public ICollection<Order> Orders { get; set; }
        public ICollection<Branch> Branches { get; set; }
    }

public class Branch
{
    public int Id { get; set; }
    public string Location { get; set; }
    public ICollection<Item> Items { get; set; }
}

 public class Warehouse
    {
        public int Id { get; set; }
        public ICollection<Item> Items { get; set; }
        public ICollection<Branch> Branches { get; set; }
    }

我的代码中的问题是仓库中的项目与分支中的项目相同,这不是真的也没有错,OOP如何处理这种情况?

2 个答案:

答案 0 :(得分:1)

在适当的班级设计中,DiscountPercentage不是项目的属性。它也不是分支机构的财产。相反,它是分支和项目之间 relation 的属性:

UML diagram of explained class relationships

那么你要做的是创建一些BranchItem类型,它基本上只位于它们之间并定义包括附加属性的关系:

public class BranchItem
{
    public Branch Branch { get; set; }
    public Item Item { get; set; }

    public double DiscountPercentage { get; set; }
}

答案 1 :(得分:0)

有人想知道你是否真的需要BranchWarehouse个对象,或者每个项目是否只有一个属性location

在任何情况下,解决问题的OO方法是创建一个新类,比如WarehouseItem,其中包含Warehouse应该能够在{{1}中访问的所有内容}}。然后,使用Item扩展WarehouseItem,并在Item中添加所需的任何属性。在Branch内,您应该只与Warehouse进行交互,即使对象实际上是WarehouseItem类型。这是非常好的教科书polymorphism

(一个警告:一般来说,你会希望具有较少属性的较简单的类具有更通用的名称,即Item,并且具有更多属性的扩展名具有更具体的名称。因此,我的示例并不完美。 )