构建灵活且可重用的类层次结构

时间:2011-02-09 12:23:13

标签: c# oop design-patterns

让我们回顾一些实体:

  • 公司
  • 协作者
  • 下属工作人员

有一些规则:

  1. 协作者可以是其中之一:销售经理员工;
  2. 销售和经理可以有下属工人(第1条规则中描述的任何类型);
  3. 销售,经理,员工可以有主管;
  4. 每个角色都有自己的薪水 计算方法。
  5. 所以目标是创造灵活性和安全性。可重用的类层次结构。


    令我困惑的第一件事是“可以有”这句话。它应该作为一个组合实现吗?如果说“可以有多少”,那么它应该是一个带有对象列表的作文吗?

    我应该创建抽象类Collaborator,然后继承它3种其他类型还是有更聪明的方法?

    将所有实体绑定在一起并具有良好的可重用汇编的最佳方法是什么?

4 个答案:

答案 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

酋长不会为自己设置一个主要负责人。我会尝试阻止使用虚函数,并尝试使用抽象函数。

另一种选择是简单地使用一个类。一切都很好,只有销售人员或经理可以拥有下属,但在现实世界的情况下,任何人都可能需要下属。任何类型的员工的功能都可以简单地由枚举值指定。

这完全取决于你要去哪里......