如何在C#中实现具有继承的类组合

时间:2014-04-05 07:55:37

标签: c# uml composition

我是面向对象开发的新手,并感谢您在这方面的帮助。 在我的工资单系统中,我有四个类别叫做“付款”,“薪水”,“收入”和“扣除”。 准备工资需要多种类型的收入(如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();
        }

1 个答案:

答案 0 :(得分:4)

当试图弄清楚是否使用Composition或Aggregation时,要问的简单问题是

  • A 是否属于到B
  • A 是否使用 B

在你的情况下,你陈述

  

'收入'和'扣除'类与'薪水'有组合关系

所以用外行人的话说,你所说的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