C# 如何在C语言中实现带继承的类组合#
我是面向对象开发的新手,非常感谢您在这方面的帮助。 在我的工资系统中,我有四个类,分别是“支付”、“工资”、“收入”和“扣除”。 准备工资需要多种类型的收入(如加班费、奖励、空间津贴、加班费、预算津贴、结转金额等)和扣减(如保险、制服、贷款、回收、福利、膳食、预付工资等) 所以我把它分为两类,即“收入”和“扣除”。最后,“工资”类负责平衡部分,“付款”类负责支付部分(银行业务)。另一种支付方式是预付工资,这只是每月支付的一笔款项。建立的关系如下所示… “收入”和“扣除”类与“工资”有组成关系,“工资”是从“付款”派生的类。我在我的C代码中实现了这些关系,如下所示… 我的问题是 1.我是否以适当的方式完成了相关课程 2.关系的实施是否正确 付款C# 如何在C语言中实现带继承的类组合#,c#,uml,composition,C#,Uml,Composition,我是面向对象开发的新手,非常感谢您在这方面的帮助。 在我的工资系统中,我有四个类,分别是“支付”、“工资”、“收入”和“扣除”。 准备工资需要多种类型的收入(如加班费、奖励、空间津贴、加班费、预算津贴、结转金额等)和扣减(如保险、制服、贷款、回收、福利、膳食、预付工资等) 所以我把它分为两类,即“收入”和“扣除”。最后,“工资”类负责平衡部分,“付款”类负责支付部分(银行业务)。另一种支付方式是预付工资,这只是每月支付的一笔款项。建立的关系如下所示… “收入”和“扣除”类与“工资”有组成关系,“
class payment
{
public virtual void pay()
{
}
}
工资
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();
}
当试图确定是使用组合还是聚合时,要问的简单问题是
- A属于B吗
- A用B吗
收入
/扣减
属于工资
,换句话说,工资
由收入
/扣减
(以及其他许多组成部分)组成。话虽如此,我还是希望你的薪水
班看起来像
public class Salary
{
private Earning e;
private Deduction d;
public Salary()
{
this.e = new Earning();
this.d = new Deduction();
}
public void override Pay()
{
...
}
}
收入
/扣减
不应该知道工资
,这些类实际上是构成工资的组成部分。例如,您的课程可能看起来像
public class Earning
{
public Earning()
{
}
public void Calculate()
{
...
}
}
如果收入
/扣减
需要工资
中的信息,则您可以向下传递此信息,但是,您不应传递对工资
本身的引用,因为这将打破组合关系(并实际上引入收入
/工资
之间的聚合)
在继承方面,如果基类Payment
只提供了一个简单的Pay
方法,那么我建议使用一个接口,例如
public interface IPayable
{
void Pay();
}
public class Salary : IPayable
{
...
}
当试图确定是使用组合还是聚合时,要问的简单问题是
- A属于B吗
- A用B吗
在你的情况下,你说
“收入”和“扣除”类与“工资”有组成关系
因此,用外行的话说,你所说的是收入
/扣减
属于工资
,换句话说,工资
由收入
/扣减
(以及其他许多组成部分)组成。话虽如此,我还是希望你的薪水
班看起来像
public class Salary
{
private Earning e;
private Deduction d;
public Salary()
{
this.e = new Earning();
this.d = new Deduction();
}
public void override Pay()
{
...
}
}
收入
/扣减
不应该知道工资
,这些类实际上是构成工资的组成部分。例如,您的课程可能看起来像
public class Earning
{
public Earning()
{
}
public void Calculate()
{
...
}
}
如果收入
/扣减
需要工资
中的信息,则您可以向下传递此信息,但是,您不应传递对工资
本身的引用,因为这将打破组合关系(并实际上引入收入
/工资
之间的聚合)
在继承方面,如果基类Payment
只提供了一个简单的Pay
方法,那么我建议使用一个接口,例如
public interface IPayable
{
void Pay();
}
public class Salary : IPayable
{
...
}
这取决于你想要什么。像往常一样。在这里,我没有得到“收入”和“扣除”的预期角色。但是工资是一种支付,听起来很可疑。如果工资分两部分支付怎么办?我同意@Henkholtman的观点,我开始回答这个问题,然后意识到工资和收入之间的模糊性-你需要澄清每个班级的角色。@Henk Holterman,实际上,在这种情况下,准备工资需要多种类型的收入(如加班费、奖励、空间津贴、加班费、预算津贴、结转金额等)和扣除额(如保险、制服、贷款、回收、福利、膳食、预付工资等)因此,我将其分为两类,即“收入”和“扣除”。最后,“工资”类负责平衡部分,“付款”类负责支付部分(银行业务)。另一种支付方式是预付工资,这只是每月支付的金额。谢谢!这取决于你想要什么。像往常一样。我在这里不理解“收入”和“扣除”的预期作用。但是工资是一种支付方式,听起来很可疑。如果工资分两部分支付呢?我同意@HenkHolterman,我开始回答这个问题,然后意识到了模糊性在工资
和收入
之间-你需要澄清每个班级的角色。@Henk Holterman,实际上在这种情况下,准备工资需要多种类型的收入(如加班费、奖励、空间津贴、加班费、预算津贴、结转金额等)和扣除额(如保险、制服、贷款、追偿、福利、膳食、预付工资等)因此我将其分为两类,即“收入”和“扣除”。最后,“工资”类负责平衡部分,“付款”类负责支付部分(银行)。其他类型的付款是sal