为基类中的隐式构造提供实现

时间:2015-07-14 22:17:43

标签: c# inheritance operator-overloading

在基类中,有没有办法提供适用于所有继承类的隐式转换?

以下是我正在使用的类的简化示例:

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中的名称和特定格式说明符。看起来我应该能够将隐式运算符放入所有这些类继承的基类中。那可能吗?问题是在基类中,我必须返回正确子类的实例,我不知道这是否可行,或者是否可取。

或者有更好的方法来构建这些类吗?

P.S。请参阅my follow-up question我要求批评可能的方法来完成我的要求。 (在问这个问题后我才想到这一点。)

1 个答案:

答案 0 :(得分:1)

@DavidArno在评论中已经提到为什么技术上不可能,但是让我们忘记现在并考虑一下你想要实现的目标。

假设我有一个带有以下签名的方法:ConsumeDate1(Date1 date)。如果您提供如您所述的“魔法转换”,我应该能够将字符串传递给方法(ConsumeDate1("1507")),应该进行隐式转换,并将结果提供给方法实现。转换的唯一信息是输入是字符串,输出应该是Date1 或派生类。转换怎么会知道选择哪个类?它唯一知道的是Date1。即使您能够在Date2Date3中重新定义转化,转化操作也无法神奇地决定转换为哪种实现。

在这种情况下,遗传不幸没有帮助。例如,您可以在每个派生类上提供静态工厂方法(ParseFromString ...)。

这些问题显然是你必须明确选择使用哪种类型 - ConsumeDate1(Date3.Parse("1507")),但我们已经确定转换无法解决这个问题并且无论如何都需要帮助。

另一个问题是你不能通过C#的类型系统对所有派生类强制执行那些静态方法。如果你想确保它们被实现(至少在你拥有的代码中),你可以使用Convetion Testing并反过来检查Date1的所有子类是否包含这样的静态方法。