Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 构建灵活且可重用的类层次结构_C#_Oop_Design Patterns - Fatal编程技术网

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

C# 构建灵活且可重用的类层次结构,c#,oop,design-patterns,C#,Oop,Design Patterns,让我们回顾一下一些实体: 公司 合作者; 首领 下属工人。 有一些规则: 合作者可能是其中之一:销售、经理、, 受雇者 销售和经理可以有第1条规则中规定的任何类型的下属员工; 销售、经理、员工可以有主管; 每个角色都有自己的薪水 计算方法。 因此,目标是创建灵活且可重用的类层次结构 让我困惑的第一件事是会有短语。它应该作为一个组合来实现吗?如果说它可以有同样多的东西,那么它应该是一个有物品列表的合成物吗 我应该创建抽象类Collaborator,然后从中继承其他3种类型,还是有更聪明的方法 将所

让我们回顾一下一些实体:

公司 合作者; 首领 下属工人。 有一些规则:

合作者可能是其中之一:销售、经理、, 受雇者 销售和经理可以有第1条规则中规定的任何类型的下属员工; 销售、经理、员工可以有主管; 每个角色都有自己的薪水 计算方法。 因此,目标是创建灵活且可重用的类层次结构

让我困惑的第一件事是会有短语。它应该作为一个组合来实现吗?如果说它可以有同样多的东西,那么它应该是一个有物品列表的合成物吗

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

将所有实体连接在一起并具有良好的可重用组件的最佳方法是什么

Can have和它后面跟着worker这一事实告诉我这是一个具有0对多关系的关系组合,因此您提到的列表可能是空的

抽象类协作者似乎是合理的。

可以有,而且它后面跟着worker,这一事实告诉我这是一个具有0对多关系的关系组合,因此您提到的列表可能是空的


抽象类协作者似乎是合理的。

可以在UML中表示为0..*这意味着0或更多,是的,与对象列表的组合是好的,使用集合而不是数组

Collaborator是一个抽象类,因为不会有Collaborator本身的实例。我想,继承这三种类型的合作者是最好的方式

我必须补充一点,如果您的项目中只有一家公司,那么您需要实现Singleton设计模式

关于薪资使用虚拟方法并覆盖它


我希望这不是你的家庭作业

可以在UML中表示为0..*这意味着0或更多,是的,使用对象列表进行组合是很好的,使用集合而不是数组

Collaborator是一个抽象类,因为不会有Collaborator本身的实例。我想,继承这三种类型的合作者是最好的方式

我必须补充一点,如果您的项目中只有一家公司,那么您需要实现Singleton设计模式

关于薪资使用虚拟方法并覆盖它


我希望这不是你的家庭作业

我猜这个问题的答案是主观的,并且会根据您的需要而变化,但这就是我将如何实施它:

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 }
}

这段代码还没有经过测试。

我想这个问题的答案是主观的,并且会根据您的需要而变化,但我会这样实现它:

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 }
}

这段代码还没有经过测试。

我发现这个问题表述得很糟糕,只需添加少量额外信息,设计就会发生严重变化

基于你所写的,我可以考虑创建以下类“-----”意思是扩展:

Company AbstractCollaborator (Chief member, CalculateSalary() { return base + AdditionalSalary() }, abstract AdditionalSalary()) - Chief - AbstractLeader ( List subordinates ) -- Sales -- Manager - Employee 酋长不会为自己设定酋长。我会尽量避免使用虚拟函数,而尝试使用抽象函数

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


这在很大程度上取决于你要做什么…

我发现这个问题表述得很糟糕,只需添加少量额外信息,设计就会发生严重变化

基于你所写的,我可以考虑创建以下类“-----”意思是扩展:

Company AbstractCollaborator (Chief member, CalculateSalary() { return base + AdditionalSalary() }, abstract AdditionalSalary()) - Chief - AbstractLeader ( List subordinates ) -- Sales -- Manager - Employee 酋长不会为自己设定酋长。我会尽量避免使用虚拟函数,而尝试使用抽象函数

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


这在很大程度上取决于你将如何使用这个…

为了简单起见,你可以只写*而不是0..*不,这不是我的家庭作业,我被问到了这一点,并将组件的可重用性作为目标。。这个问题似乎不是那么微不足道。因为有很多关于业务对象的书。我无法想象使用角色会有什么样的抽象。根本不需要单例。@H.B我知道通常都会使用这两种方法,@Helica我希望你能得到你想要的东西。为了简单起见,你可以只写*而不是0..*。不,这不是我的家庭作业。有人问过我这方面的问题,并把程序集的可重用性作为目标。。这个问题似乎不是那么微不足道。因为有很多关于业务对象的书。我无法想象使用角色会有什么样的抽象。根本不需要单例。@H
.B我知道这两种方法都常用,@helicera我希望你能得到你想要的东西。工资计算的规则是什么?每个角色都有不同的薪资计算方法,或者有些角色有共同的薪资计算方法?我还想要求澄清下属员工和员工之间的关系。@Steven Jeuris每个角色都有自己的薪资计算方法,但Collaborator类保留共同的基本薪资。薪资计算的规则是什么?每个角色都有不同的薪资计算方法,或者有些角色有相同的薪资计算方法?我还想要求对下属员工和员工进行澄清,以便更好地了解他们之间的关系。@Steven Jeuris每个角色都有自己的薪资计算方法,但Collaborator类保留共享的基本工资。但我如何将其连接到公司实体?您没有描述与公司的连接。如果您只需要Collaborator类的功能,那么它可能只是Collaborator的列表。但是我如何将其连接到公司实体?您没有描述到公司的连接。如果您只需要Collaborator类的功能,那么它可能只是一个Collaborator的列表。@helicera:已更新以支持基本工资。@helicera:已更新以支持基本工资。