我是面向对象开发的新手,并感谢您在这方面的帮助。 在我的工资单系统中,我有四个类别叫做“付款”,“薪水”,“收入”和“扣除”。 准备工资需要多种类型的收入(如OT,奖励,空间津贴,额外班次付款,预算津贴,预付金额等)和扣除(如保险,统一,贷款,恢复,福利,膳食,提前工资等) 。) 所以我将其分为两类,即“收入”和“收入”。和'扣除'。最后上课'薪水'应该做平衡部分和班级'付款'将处理付款部分(银行)。其他类型的付款是工资预付款,这只是每月支付的金额。建模的关系,如下...... “收入”和“扣除”类与“薪水”具有组合关系,“薪水”是来自“付款”的派生类。我在C#代码中实现了这些关系,如下所示...... 我的问题是
1.我是否以适当的方式关联课程?
2.关系的实施是否正确?
付款
class payment
{
public virtual void pay()
{
}
}
SALARY
class salary:payment
{
//Composition of ‘Earning’ class
private earning E1;
public salary()
{
E1 = new earning(this);
}
//Calling calEarning() of ‘Earning’ class through ‘Salary’ class
public void calEarningForSal()
{
E1.calEarning();
}
//Implementing pay method of base class
public override void pay()
{
}
}
劳动报酬
public class earning
{
//Since earning has a composition relationship with salary…
private salary S1;
internal earning(salary sal)
{
this.S1 = sal;
}
//This method will calculate earnings of employees
public void calEarning()
{
}
}
主要方法
Main()
{
salary newSal = new salary();
newSal.calEarningForSal();
}
答案 0 :(得分:4)
当试图弄清楚是否使用Composition或Aggregation时,要问的简单问题是
在你的情况下,你陈述
'收入'和'扣除'类与'薪水'有组合关系
所以用外行人的话说,你所说的Earning
/ Deduction
属于 a Salary
,换句话说,{{ {1}} 由 Salary
/ Earning
(以及许多其他组件)组成。话虽如此,我希望你的Deduction
课看起来像
Salary
public class Salary
{
private Earning e;
private Deduction d;
public Salary()
{
this.e = new Earning();
this.d = new Deduction();
}
public void override Pay()
{
...
}
}
/ Earning
不应该知道Deduction
,这些类是构成Salary
的有效组件。例如,您的Salary
类可能看起来像
Earning
如果public class Earning
{
public Earning()
{
}
public void Calculate()
{
...
}
}
/ Earning
需要来自 Deduction
的信息,那么您可以向下传递此信息,但是,您不应该传递对{{1}的引用本身因为这会破坏组合关系(并且实际上引入了Salary
/ Salary
)之间的聚合。
关于继承内容,如果基类Earning
不提供简单的Salary
方法,那么我建议使用接口,例如。
Payment