如果类A有一个字段B,还有办法抽象出A和B吗
本文关键字:抽象 有一个 字段 如果 | 更新日期: 2023-09-27 18:20:21
我有一个类
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的参数值来计算学生的IQ和EQ。
此类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.预测IQ得分,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"关系,但出于报告目的,我想将它们抽象为"is-a"关系。
什么是一个好的oop设计来建立这一点?
继承用于为"is-a"关系建模。那么,问问自己:学生档案评估是一种学生档案吗?听起来不像。听起来像是学生档案评估有一个学生档案。
详细说明一下:
A类是-AB意味着A类的每个实例也是B类的实例。这意味着你能用B做的一切,你也能用A做。你能用学生档案做的一切吗?
问问自己,在自然语言讨论中,你会如何描述类之间的关系(或者更准确地说,它们的实例)。也许你会说,
学生档案评估包含评估学生档案的结果
如果是这样的话,那么很明显,学生档案评估不是一种学生档案。除其他外,这意味着学生档案评估可以保持评估学生档案评估的结果!
根据显示报告的问题编辑,我建议在两个类中重写ToString()
方法。然后您可以简单地使用studentProfile.ToString()
和studentProfileEvaluation.ToString()
。"Student Profile Evaluationis-aobject"answers"Student Profileis-aobject"。
您不能在接口中声明字段,但您可以声明properties。
在您的情况下,我可能建议使用一个接口,或者可能使用一个抽象基类作为祖类,并让StudentProfile
和StudentProfileEvaluations
实现/继承它。
这样,StudentProfile
和StudentProfileEvaluations
将不会(也不应该)相互继承,并且StudentProfileEvaluations
可以具有作为StudentProfile
的属性,即使使用您指定的构造函数也是如此。
报告代码可以是
public void GenerateReport(IStudentProfile studentProfile)
{
return studentProfile.PredictedEQScore.ToString() + studentProfile.Param1.ToString() +........
}