类组成为实例变量

时间:2014-05-21 13:01:08

标签: c# oop uml composition

我有一个名为WageInfo的类,它与EarningDeduction类有组合关系。所以我实现如下......

class WageInfo
{
    int ID {get; set;}
    Earning E = new Earning();
    Deduction D = new Deduction();

}

我知道我没有在WageInfo构造函数中初始化这些对象,因此无法将参数传递给EarningDeduction's构造函数。

除此之外,这可以被视为作品吗?这种方法还有其他缺陷吗?

修改

关于课程的更多细节

class Earning
{
int ID {get; set;}
Decimal Amount {get; set;}
DateTime Period {get; set;}

}

class Deduction
{
int ID {get; set;}
Decimal Amount {get; set;}
DateTime Period {get; set;}
String Remarks {get; set;}
}

我正在按以下方式访问这些属性......

在Program.cs中

WageInfo WI= new WageInfo();
WI.E.Amount= 1000;

EDIT2:

我的班级关系就是这样......

enter image description here

WageInfo可能有多个EarningsDeductionWageBalances。因此PrepareEarnings()课程中的WageManager如下...

 public List<Earning> PrepareEarnings(DateTime wagePeriodStartDate, DateTime wagePeriodEndDate)
        {
            return GetEarningsToList(wagePeriodStartDate,wagePeriodEndDate);
        }


        public List<Earning> GetEarningsToList(DateTime startDate, DateTime endDate)
        {
            return CalculateEarnings(startDate,endDate).Rows.OfType<DataRow>().Select(CreateEarnings).ToList();
        }

        private DataTable CalculateEarnings(DateTime startDate, DateTime endDate)
        {
            return _DataService.GetEarnings(startDate,endDate);
        }

        private Earning CreateEarnings(DataRow row)
        {
            WageInfo wageInfo = new WageInfo();

            wageInfo.Earning.EmployeeID = row[0] == DBNull.Value ? 0 : Convert.ToInt32(row[0]);
            wageInfo.Earning.WorkDays = row[2] == DBNull.Value ? 0 : Convert.ToInt32(row[2]);

            //

            return wageInfo.Earning;
        }

2 个答案:

答案 0 :(得分:2)

因此,据我所知,在这种情况下,初始化构造函数之外的变量是否有效存在潜在的问题。关注this question我建议如下:

由于WageInfo根据收入和扣减而变化,因此您不应在构造函数之外使用初始化。你为什么不问?那么,如果收入或扣减发生变化会发生什么?

WageInfo WI= new WageInfo();
WI.E.Amount= 1000;

这会很快变得难看。然而: 如果您不对这些变量进行更改,则您的方法有效。一般来说,每当我不打算对变量进行更改时,我就会使用这种类型的初始化,例如:我可以把它做成只读。

在所有其他情况下,我建议使用Dependecy Injection(或至少使用它的简单形式)。所以,在你的情况下,你可以做到

Earnings earnings = new Earnings(1000);
Deduction deduction = new Deduction(0);
WageInfo info = new WageInfo(earnings,deduction)

编辑:正如下面的评论中所提到的,将构造的责任交给WageInfo类本身会更好。可以添加方法AddEarnings / AddDeductions,其中创建相应的对象。

WageInfo info = new WageInfo();
info.AddEarnings(100);

另外,就像@Aleks提到的那样,至少使用私人制定者是一个好主意。通过声明这样的属性来实现:

public Earning { get; private set; }

答案 1 :(得分:1)

包含对象(此处为WageInfo)完全控制包含对象(E,D)的生命周期时,关联就是合成。

E和D是在WageInfo中创建的,因此它可以用于合成。我想它们也会从WageInfo中删除,所以这足以说明这种关系就是构图。

在adition中,它们不应该从包含对象(私有数据成员)的外部直接看到。

编辑部分的注释:

您应该制作E和D私人成员,以使作品更清晰。至少一个吸气者会做这个工作。但这不是强制性的,生命周期控制是基本的。