我有一个班级
public class StudentProfile
{
public string Name {get; set;}
public string ContactAddress {get; set;}
public DateTime CreatedDate{get; set;}
public double PredictedIQScore {get; set;}
public double PredictedEQScore {get; set;}
public double Param1 {get; set;}
public double Param2 {get; set;}
public double Param3 {get; set;}
...
public double Param20 {get; set;}
}
我有另一个类StudentProfileEvaluation,它是参考StudentProfile构建的。有不同的评估方法可以根据StudentProfile的参数值来计算学生的智商和情商。
此类的目的,StudentProfileEvaluation是存储这些信息。
public class StudentProfileEvaluation
{
public StudentProfileEvaluation(StudentProfile studentProfile)
{
ParentStudentProfile = studentProfile;
}
public readonly ParentStudentProfile;
private double? predictedIQScore;
private double? predictedEQScore;
public double PredictedIQScore
{
get
{
if (predictedIQScore.HasValue)
return predictedIQScore;
else
return ParentStudentProfile.PredictedIQScore;
}
set
{
predictedIQScore = value;
}
}
public double PredictedEQScore
{
get
{
if (predictedEQScore.HasValue)
return predictedEQScore;
else
return ParentStudentProfile.PredictedEQScore;
}
set
{
predictedEQScore = value;
}
}
public double Param1
{
return ParentStudentProfile.Param1;
}
...
public double Param20
{
return ParentStudentProfile.Param20;
}
}
现在,在整个代码库中,我想要获取各种情况,
x.PredictedEQScore, x.PredictedIQScore, x.param1,x.param2,.............等创建各种图表和报告。 x可以是StudentProfile或StudentProfileEvaluation。
在当前的设置中,每次生成新的图表/报告时,我都必须执行以下操作。
public void GenerateReport1(StudentProfile studentProfile)
{
return studentProfile.PredictedEQScore.ToString() + studentProfile.Param1.ToString() +........
}
public void GenerateReport1(StudentProfileEvaluation studentProfile)
{
return studentProfile.PredictedEQScore.ToString() + studentProfile.Param1.ToString() +........
}
所以,虽然StudentProfile和StudentProfileEvaluation有一个" has-a"关系,我想将它们抽象出来,并且#34; is-a"报告目的的关系。
建立这个有什么好的oop设计?
答案 0 :(得分:7)
继承用于模拟" is-a"关系。那么,问问自己:学生档案评估是一种学生档案吗?它听起来并不像。这听起来像学生档案评估有学生档案。
详细说明:
A类是-a B 意味着A类的每个实例也是B类的实例。这意味着您可以用B做的所有事情,你您也可以使用学生档案进行学生档案评估吗?
在自然语言讨论中,问问自己如何描述类之间的关系(或者更准确地说,是他们的实例)。也许你可能会说,
学生档案评估包含评估学生档案的结果
如果是这种情况,那么学生档案评估显然不是一种学生档案。除此之外,这意味着学生档案评估可以包含评估学生档案评估的结果!
根据您的问题编辑显示报告,我建议覆盖两个类中的ToString()
方法。然后,您只需使用studentProfile.ToString()
和studentProfileEvaluation.ToString()
即可。 "学生档案评估是一个对象"和"学生档案是一个对象"。
答案 1 :(得分:0)
您无法在界面中声明字段,但您可以声明属性,并且您拥有属性。
在您的情况下,我可能会建议使用一个接口,或者可能是一个抽象基类作为祖先,并让StudentProfile
和StudentProfileEvaluations
实现/继承它。
这样,StudentProfile
和StudentProfileEvaluations
不会(也不应该)相互继承,StudentProfileEvaluations
可以拥有StudentProfile
的属性,即使是你指定的构造函数。
报告代码可以是
public void GenerateReport(IStudentProfile studentProfile)
{
return studentProfile.PredictedEQScore.ToString() + studentProfile.Param1.ToString() +........
}