如果类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设计来建立这一点?

如果类A有一个字段B,还有办法抽象出A和B吗

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


详细说明一下:

A类是-AB意味着A类的每个实例也是B类的实例。这意味着你能用B做的一切,你也能用A做。你能用学生档案做的一切吗?

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

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

如果是这样的话,那么很明显,学生档案评估不是一种学生档案。除其他外,这意味着学生档案评估可以保持评估学生档案评估的结果!


根据显示报告的问题编辑,我建议在两个类中重写ToString()方法。然后您可以简单地使用studentProfile.ToString()studentProfileEvaluation.ToString()。"Student Profile Evaluationis-aobject"answers"Student Profileis-aobject"。

您不能在接口中声明字段,但您可以声明properties

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

这样,StudentProfileStudentProfileEvaluations将不会(也不应该)相互继承,并且StudentProfileEvaluations可以具有作为StudentProfile的属性,即使使用您指定的构造函数也是如此。

报告代码可以是

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