2015-09-15 38 views
1

我正在閱讀具有幾個常見屬性和幾個不同屬性的不同類型CSV文件的用戶輸入。我創建了一個基類TestCaseData和如下派生類:如何爲派生類對象編寫驗證方法

public abstract class TestCaseData 
{ 
public abstract string ID { get; set; } 
public abstract string Name{ get; set; } 
} 

public class DerivedClassOne :TestCaseData 
{ 
public override string ID { get; set; } 
public override string Name{ get; set; } 

pubic string DerivedOneProperty{ get; set; } 
} 

public class DerivedClassTwo :TestCaseData 
{ 
public override string ID { get; set; } 
public override string Name{ get; set; } 

pubic string DerivedTwoProperty{ get; set; } 
} 

我讀的CSV文件,並創建派生類的列表,如下面

List<TestCaseData> lstTestCaseData = MethodCallToReturnListOf_DerivedOneClassFromCSV(); 

由於分配給基類的列表現在我有lstTestCaseData我必須驗證用戶輸入,也是我無法找到一種方法來編寫一種方法來驗證類型爲DerivedOnePropertyDerivedTwoProperty的用戶輸入,因爲他們有自己的屬性。任何人都可以幫助我嗎?

我有方法的簽名類似的東西

public string ValidateCompleteFile(List<TestCaseData> TestCaseInputList, out bool IsInputValid) 

回答

2

你可以改爲放置在TestCaseData類的抽象的驗證方法,然後讓每個繼承這個類實現它,他們需要怎樣的類。

public abstract class TestCaseData 
{ 
public abstract string ID { get; set; } 
public abstract string Name{ get; set; } 
public abstract bool Validate(); 
} 

然後爲TestCaseInputList集合中的每個條目調用此方法。

+0

似乎很合理,雖然我可能更喜歡封裝在類構造函數中的驗證(雖然有時這是不可能的,因爲第三方庫進行解析)。我認爲能夠假設每個創建的對象都是有效的,而不是讓客戶端負責調用全部地方的'IsValid()',這就更加清晰了。 – kai

+0

我同意這不是最佳解決方案,但由於該問題討論了現有的ValidateCompleteFile方法,因此只需從此處調用此新的Validate方法。 – TomDoesCode

+0

其實問題是我使用模型TestCaseData,DerivedClassOne,DerivedClassTwo編寫客戶端代碼,並且無法修改類定義(它不提供Validate方法)。所以現在在客戶端代碼中需要編寫一個單獨的驗證方法,我不想爲DerivedClassOne類型和DerivedClassTwo類型編寫兩個不同的驗證方法。 –

0

如果您致力於最初構思的代碼模式(即在每個對象上調用驗證方法),有關抽象方法的答案是最佳解決方案。但也許最好驗證它的setter中的每個字段:

public abstract class TestCaseData 
{ 
    private string id, name; 

    public abstract string ID { get; set; } 
    public abstract string Name{ get; set; } 
} 

public class DerivedClassOne : TestCaseData 
{ 
    public override string ID 
    { 
     get { return id; } 
     set 
     { 
      if (...) throw new ArgumentException(); 

      ... 

      id = value; 
     } 
    } 

    ... 
} 

這樣一旦遇到無效值就會引發異常。想象一下,如果您在檢查每一個對象是否有效之前創建了一百萬個對象,只是發現第一個對象是無效的。此解決方案通過在設置屬性時主動進行驗證來避免這種情況。

+1

請記住,如果對於每個屬性,'null' /'default(T)'不是一個可接受的值,這可能會引起誤解!我同意setter驗證(雖然我更喜歡構建注入/ setter方法而不是屬性)是一件好事,但如果它不包含所有不變量,它可能會導致錯誤的安全感。 – kai

+0

好點,這一切都取決於他的具體應用。 –

相關問題