2014-09-02 40 views
0

我有一個類如果類A有一個字段B,是還有一種方法來抽象出甲乙

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.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具有「有」的關係,我想抽象出來爲「是」的報告目的的關係。

什麼是良好的設計來建立這樣的?

回答

7

繼承用於建模「is-a」關係。所以,問問自己:學生檔案評估是一種學生檔案嗎?聽起來不像。這聽起來像是一個學生簡介評估has-a學生簡介。


要詳細一點:

A類是-A意味着A類的每個實例也是B類的實例,這意味着一切都可以用做B,你也可以用A做你能做什麼都可以做到學生檔案評估,你可以用學生檔案做什麼?

問自己如何在自然語言討論中描述類(或更確切地說,它們的實例)之間的關係。或許你會說,

一個學生檔案評估認爲評價一個學生檔案

的結果。如果是這樣的話,那麼顯然是學生的個人資料評價是不是一種學生檔案的。除此之外,這意味着學生檔案評估可以保持評估學生檔案評估的結果!


基於顯示報告你的問題的編輯,我會建議重寫這兩類的ToString()方法。那麼你可以簡單地使用studentProfile.ToString()studentProfileEvaluation.ToString()。 「學生檔案評價is-a object」,以及「學生檔案is-a object」。

+3

這個想法,*爲-A * VS *有-A *應在有關繼承任何面向對象的語言教的第一件事。 – 2014-09-02 22:31:20

+1

@ErikPhilips多數民衆贊成在學習OOP概念時,我被教導的第一件事...猜猜他們做了正確的事情:) – BradleyDotNET 2014-09-02 22:34:22

+1

@BradleyDotNET那麼你有一個很好的教練。有時候教師會被包裝在如何而不是爲什麼。 – 2014-09-02 22:35:28

0

在接口你不能聲明領域,但你可以聲明性能,你有那些。

在你的情況,我可能會建議有一個接口,或者可能是一個抽象的基類作爲祖先,並有StudentProfileStudentProfileEvaluations實現/繼承。

這樣,StudentProfileStudentProfileEvaluations不會(也不應該)從彼此,StudentProfileEvaluations繼承可以有一個屬性,它是一個StudentProfile,即使您指定的構造函數。

和報表代碼可以

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

請問你爲什麼推薦這個? – 2014-09-02 22:32:36

+0

@JohnSaunders根據顯示的屬性,它們看起來很相似。基本上,「評估」將引導它的內部「Profile」屬性。 '有'關係仍然成立。 – SWeko 2014-09-02 22:33:47

+0

好吧,但接口或抽象類的「目的」是將常見行爲分組。僅僅因爲它們可能具有類似的屬性並不意味着它們將被類似地對待(除了可能在報告方面)。 – 2014-09-02 22:39:32

相關問題