簡體   English   中英

提供基類隱式構造的實現

[英]Provide implementation for implicit construction in base class

在基類中,有沒有一種方法可以提供適用於所有繼承類的隱式轉換?

這是我正在使用的類的簡化示例:

public class Date1 {
   public Date1(DateTime value) {
       Value = value;
   }

   public DateTime Value { get; set; }

   public static implicit operator Date1(string value) {
      DateTime dt;
      DateTime.TryParse(value, out dt);
      return new Date1(dt);
   }

   public void SerializeTo(TextWriter textWriter)
   {
      textWriter.Write("{0:yyMM}", Value);
   }
}

我計划把Date2Date3類,它們唯一的區別從Date1的名稱,並在特定的格式說明SerializeTo 看來我應該能夠將隱式運算符放到所有這些類都繼承自的基類中。 那可能嗎? 問題在於,在基類中,我必須返回正確子類的實例,而且我不知道這是否可能或明智。

還是有更好的方法來構造這些類?

附言:請參閱我的后續問題 ,在這里我要求對完成我所要求的方法的批評。 (我問這個問題后才想到這一點。)

@DavidArno在評論中已經提到了為什么在技術上不可能做到這一點,但讓我們暫時忘記這一點,並考慮一個您要實現的目標的示例。

假設我有一個帶有以下簽名的方法: ConsumeDate1(Date1 date) 如果您提供了您所描述的“神奇轉換”,我應該能夠將字符串傳遞給方法( ConsumeDate1("1507") ),應該進行隱式轉換,並將結果提供給方法實現。 轉換具有的唯一信息是輸入是字符串,並且輸出應為Date1 或派生類 轉換如何知道選擇哪個班級? 它唯一知道的是Date1 即使您能夠在Date2Date3重新定義轉換,轉換操作也無法神奇地確定要轉換為哪個實現。

在這種情況下,不幸的是繼承沒有幫助。 例如,您可以在每個派生類上提供靜態工廠方法( ParseFromString ...)。

這些問題顯然是,您必須顯式選擇要使用的類型ConsumeDate1(Date3.Parse("1507")) ,但是我們已經確定轉換無法確定其本身,並且仍然需要幫助。

另一個問題是,您不能通過C#的類型系統在所有派生類上強制使用這些靜態方法。 如果要確保實現它們(至少在您擁有的代碼中),則可以使用對流測試並反思地檢查Date1所有子類Date1包含此類靜態方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM