我有一个名为WageInfo
的类,它与Earning
和Deduction
类有组合关系。所以我实现如下......
class WageInfo
{
int ID {get; set;}
Earning E = new Earning();
Deduction D = new Deduction();
}
我知道我没有在WageInfo
构造函数中初始化这些对象,因此无法将参数传递给Earning
和Deduction'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:
我的班级关系就是这样......
WageInfo
可能有多个Earnings
,Deduction
和WageBalances
。因此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;
}
答案 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私人成员,以使作品更清晰。至少一个吸气者会做这个工作。但这不是强制性的,生命周期控制是基本的。