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

本文关键字:实现 基类 | 更新日期: 2023-09-27 18:02:47

在基类中是否有一种方法可以提供适用于所有继承类的隐式转换?

下面是我使用的一个类的简化示例:

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中重新定义转换,转换操作也不能神奇地决定转换到哪个实现。

在这种情况下,不幸的是继承不起作用。例如,您可以在每个派生类上提供静态工厂方法(Parse, FromString…)。

这些的问题显然是你必须明确地选择使用哪种类型- ConsumeDate1(Date3.Parse("1507")),但我们已经确定转换不能自己弄清楚,无论如何都需要帮助。

另一个问题是,你不能通过c#的类型系统在所有派生类上强制这些静态方法。如果您想确保它们被实现了(至少在您自己的代码中),您可以使用惯例测试,并反思性地检查Date1的所有子类是否包含这样的静态方法。