让我们回顾一些实体:
有一些规则:
所以目标是创造灵活性和安全性。可重用的类层次结构。
令我困惑的第一件事是“可以有”这句话。它应该作为一个组合实现吗?如果说“可以有多少”,那么它应该是一个带有对象列表的作文吗?
我应该创建抽象类Collaborator,然后继承它3种其他类型还是有更聪明的方法?
将所有实体绑定在一起并具有良好的可重用汇编的最佳方法是什么?
答案 0 :(得分:0)
"Can have"
以及它跟随"workers"
这一事实告诉我这是一个"has a"
关系(组合),其关系为0到多(所以你提到的列表就可以了是空的)
抽象类Collaborator似乎很合理。
答案 1 :(得分:0)
可以在UML中表示为(0 .. *),表示0或更多,是带有对象列表的组合是好的,使用集合而不是数组。
Collaborator是一个抽象类,因为没有Collaborator本身的实例。继承3种类型的协作者是我猜的最佳方式。
我必须补充一点,如果您的项目中只有一家公司,则需要实施Singleton
设计模式。
关于Salary使用虚拟方法并覆盖它。
我希望这不是你的功课;)
答案 2 :(得分:0)
我想这个问题的答案是主观的,会根据你的需要而改变,但这就是我实现它的方法:
public class Company {
public List<Collaborator> Collaborators { get; set; }
}
public abstract class Collaborator {
public Collaborator(Company company) {
company.Collaborators.Add(this);
}
public virtual Decimal Salary(object value);
public Company Company { get; set; }
}
public class Sales : Collaborator {
public override Decimal Salary(object value) {}
public List<Collaborator> Subordinates { get; set; }
public Collaborator Chief { get; set }
}
public class Manager : Collaborator {
public override Decimal Salary(object value) {}
public List<Collaborator> Subordinates { get; set; }
public Collaborator Chief { get; set }
}
public class Employee : Collaborator {
public override Decimal Salary(object value) {}
public Collaborator Chief { get; set }
}
此代码尚未经过测试。
答案 3 :(得分:0)
我发现这个问题制定得很差,只需添加一些额外的信息就可以彻底改变设计。
根据你所写的内容,我可能会考虑创建以下类(' - '表示扩展):
Company AbstractCollaborator (Chief member, CalculateSalary() { return base + AdditionalSalary() }, abstract AdditionalSalary()) - Chief - AbstractLeader ( List subordinates ) -- Sales -- Manager - Employee
酋长不会为自己设置一个主要负责人。我会尝试阻止使用虚函数,并尝试使用抽象函数。
另一种选择是简单地使用一个类。一切都很好,只有销售人员或经理可以拥有下属,但在现实世界的情况下,任何人都可能需要下属。任何类型的员工的功能都可以简单地由枚举值指定。
这完全取决于你要去哪里......