我真的很挣扎这个场景:
我有两个实体:Person
和Company
两者共享公共属性,因此我有一个基本抽象类Contact
现在我有另一个名为Supplier
的实体,可以是Company
或Person
我只是不知道如何设置这种情况。
到目前为止我所拥有的是:
public abstract class Contact {
public abstract string DisplayName { get; }
...
}
public class Person : Contact {
public override string DisplayName { ... }
public string SomePersonProperty { get; set; }
...
}
public class Company : Contact {
public override string DisplayName {...}
public string SomeCompanyProperty { get; set; }
...
}
public class Supplier {
public ICollection<Product> Products { get; set; }
...
// how can I make this being either a Person or a Company ?
}
用于此目的将是:
理想情况下,对象供应商我想要访问公司或个人的特定属性。
这甚至可能吗?设计中的缺陷在哪里(非常确定至少有一个)。
从我的想法:
Person
一个Contact
Company
一个Contact
Supplier
Person
或 a Company
Person
可以成为Supplier
Company
可以成为Supplier
Supplier
不能成为Person
和 a Company
我正在尝试在C#Entity Framework Code First中实现这一点,但我认为这个问题并不接近这些技术。
更新:我想出了这个,但我不确定是好还是凌乱。欢迎提出意见!
public abstract class Supplier {
public int SupplierId { get; set; }
public ICollection<Product> Products { get; set; }
...
}
public abstract class Supplier<T> : Supplier where T : Contact {
public T Contact { get; set; }
}
public class SupplierPerson : Supplier<Person> {}
public class SupplierCompany : Supplier<Company> {}
不确定这会生成什么类型的数据库架构......
答案 0 :(得分:0)
让您的人员和公司实施供应商界面。供应商扩展了Contact界面。现在,您可以将人员和公司纳入供应商列表
class Institution {
Supplier supplier; // refers either Person or Company
这是自然的实现,因此,您的优势在于您不需要为每个对象分配额外的空间来存储引用的供应商的类别。我认为这个解决方案是不可接受的OOP is considered evil ourdays。