如果A类有一个字段B,那么仍有办法抽象出A和B.

时间:2014-09-02 22:24:59

标签: c# oop inheritance

我有一个班级

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设计?

2 个答案:

答案 0 :(得分:7)

继承用于模拟" is-a"关系。那么,问问自己:学生档案评估是一种学生档案吗?它听起来并不像。这听起来像学生档案评估学生档案。


详细说明:

A类是-a B 意味着A类的每个实例也是B类的实例。这意味着您可以用B做的所有事情,你您也可以使用学生档案进行学生档案评估吗?

在自然语言讨论中,问问自己如何描述类之间的关系(或者更准确地说,是他们的实例)。也许你可能会说,

  

学生档案评估包含评估学生档案的结果

如果是这种情况,那么学生档案评估显然不是一种学生档案。除此之外,这意味着学生档案评估可以包含评估学生档案评估的结果!


根据您的问题编辑显示报告,我建议覆盖两个类中的ToString()方法。然后,您只需使用studentProfile.ToString()studentProfileEvaluation.ToString()即可。 "学生档案评估是一个对象"和"学生档案是一个对象"。

答案 1 :(得分:0)

您无法在界面中声明字段,但您可以声明属性,并且您拥有属性

在您的情况下,我可能会建议使用一个接口,或者可能是一个抽象基类作为祖先,并让StudentProfileStudentProfileEvaluations实现/继承它。

这样,StudentProfileStudentProfileEvaluations不会(也不应该)相互继承,StudentProfileEvaluations可以拥有StudentProfile的属性,即使是你指定的构造函数。

报告代码可以是

public void GenerateReport(IStudentProfile studentProfile)
{
    return studentProfile.PredictedEQScore.ToString() + studentProfile.Param1.ToString() +........
}